Git

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ инструкция ΠΏΠΎ созданию git-рСпозитория ΠΈ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚:

git init
git add -A
git commit -am "Create project"

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ Π½Π°ΠΌ доступны:

git remote -v

Π—Π°ΠΏΠΈΡΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π°: [локальноС Π½Π°Π·Π²Π°Π½ΠΈΠ΅] [url] Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: testrepo https://... (push)

Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΡƒ рСпозитория:

git remote rm <branch>

Если Π½Π΅Ρ‚ записСй, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΅Π΅ сами Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ:

git remote add testrepo https://...

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ наши измСнСния Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

git push -u testrepo main

Настройка локального рСпозитория

Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (ΠΈΠ½Π°Ρ‡Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ β€” с Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ):

git config --local user.name "Andrey Semakin"
git config --local user.email "andrey.semakin@incountry.com"

ΠŸΡ€ΠΎ Π²Π΅Ρ‚ΠΊΠΈ

БСйчас Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ Π½Π΅ master Π²Π΅Ρ‚ΠΊΡƒ ΠΈΠΌΠ΅Ρ‚ΡŒ, Π° main, trunk ΠΈ development. Π—Π°Ρ‡Π΅ΠΌ каТдая ΠΈΠ· Π½ΠΈΡ…?

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ:
$ git branch [-r]
-r - Π²Π΅Ρ‚ΠΊΠΈ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Π΅Ρ‚ΠΊΡƒ:
git checkout <branch name>

Π—Π°Π΄Π°Ρ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ‚ΠΊ ΠΏΡ€ΠΈ создании рСпозитория
git config --global init.defaultBranch <name>

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ
git branch -m <name>

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π΅Ρ‚ΠΊΡƒ Π² zip-Π°Ρ€Ρ…ΠΈΠ²:
git archive --format zip --output /full/path/to/zipfile.zip master

.gitignore

Π‘ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Π΅ сообщСством ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… языков ΠΈ систСм: https://github.com/github/gitignore/

Π’Π°ΠΊ ΠΆΠ΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gitignore ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ (bin, configs, ...) Достаточно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² этой ΠΏΠ°ΠΏΠΊΠ΅ Ρ„Π°ΠΉΠ» .gitignore со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

# Ignore everything in this directory
*
# Except this file
!.gitignore

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого ΠΆΠ΅ эффСкта β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ любой пустой Ρ„Π°ΠΉΠ». НСгласно стали Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ .gitkeep.

Бинтаксис Ρƒ Gitignore

Π›ΡŽΠ±Π°Ρ подстрока (Π·Π° искл /):
/some/path/te*.go

Π›ΡŽΠ±ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ:
/**/te*.go

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΏΠΎΠΊ, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ нюанс с .gitignore. Как ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π² кэшС?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сухой ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ:

$ git clean -xdn

Π—Π°Ρ‚Π΅ΠΌ для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ удалСния:

$ git clean -xdf

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠ· рСпозитория Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:

$ git rm --cached file1 file2 dir/file3

Или, Ссли Ρƒ вас ΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²:

$ git rm --cached `git ls-files -i --exclude-from=.gitignore`

ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡΡ

git status

ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚:

  • ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с послСдним ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ

  • ΠΏΡƒΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ ΠΈ проиндСксированным Ρ„Π°ΠΉΠ»ΠΎΠΌ

  • ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ git (ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

git status -s - ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ + Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
                ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Π³Ρ€Π΅ΠΏΠ°
           -v[v] - ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎ всСм измСнСниям (с -vv) - считай diff --git

git stash

About: https://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D1%80%D1%8F%D1%82%D0%B0%D0%BD%D1%8C%D0%B5

git diff

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ/Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ/...

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: отслСТиваниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с послСднСм ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ отслСТиваниС нСпроиндСксированных Ρ„Π°ΠΉΠ»ΠΎΠ²)

git diff --cached <path>

# show differences between index and working tree
# that is, changes you haven't staged to commit
git diff [filename]

# show differences between current commit and index
# that is, what you're about to commit
# --staged does exactly the same thing, use what you like
git diff --cached [filename]

# show differences between current commit and working tree
git diff HEAD [filename]

git blame

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° - ΡƒΠ²ΠΈΠ΄ΠΈΠΌ: ΠΊΠ΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° строчки Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

hunk - ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Ρ‡Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ => ΠΎΠ΄Π½ΠΎΠΌΡƒ Π΄ΠΈΡ„Ρ„Ρƒ Ρ„Π°ΠΉΠ»ΠΎΠ² соотв нСсколько hunk'ΠΎΠ²

ΠŸΡ€ΠΎ вСрсии ΠΈ состояния Π² Π³ΠΈΡ‚Π΅ (ΠΎΡ‡Π΅Π½ΡŒ понятно)

Π­Ρ‚ΠΎΡ‚ вопрос ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ:

    Π§Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒΡΡ: просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Git?
    Π§Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ: Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ (worktree), индСкс (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, staging area), Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ, ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ?
    К ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ: ΠΊ индСксу, ΠΊ послСднСму ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ, ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ?

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ схСмС:

               (i) (wt)
A - B - C - D - ? - ?
            ↑
          master
          (HEAD)

A, B, C, D β€” ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π² Π²Π΅Ρ‚ΠΊΠ΅ master.
(HEAD) β€” мСстополоТСниС указатСля HEAD.
(i) β€” состояниС индСкса Git. Если совпадаСт c (HEAD) - пуст. Если Π½Π΅Ρ‚ - содСрТит измСнСния, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ.
(wt) β€” состояниС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (working tree). Если совпадаСт с (i) β€” Π½Π΅Ρ‚ нСиндСксированных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Ссли Π½Π΅ совпадаСт β€” Π΅ΡΡ‚ΡŒ измСнСния.
↑ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ опрСдСлСнная Π²Π΅Ρ‚ΠΊΠ° ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

Π’ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π² зависимости ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ:
1. Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π΅Π³ΠΎ содСрТимоС, достаточно ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ git checkout:

git checkout aaaaaa

 (wt)
 (i)
  A - B - C - D
  ↑           ↑
(HEAD)    master

БСйчас Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ находится Π² состоянии Β«detached HEADΒ». Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ имя Π²Π΅Ρ‚ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, master):

git checkout master

2. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π½Π΅Π³ΠΎ

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π²Π°ΠΌ понадобится новая Π²Π΅Ρ‚ΠΊΠ°. МоТно ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

git checkout -b имя-Π½ΠΎΠ²ΠΎΠΉ-Π²Π΅Ρ‚ΠΊΠΈ aaaaaa

 (wt)
 (i)
  A - B - C - D
  ↑           ↑
 new       master
(HEAD)

3. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ измСнСния Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π΅ ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ послСднСм ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС:

               (i) (wt)
A - B - C - D - ? - ?
            ↑
          master
          (HEAD)

3.1 БСзопасно β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Ρ€ΠΌΠ°Π½Π° (stash)
3.1.1 Волько нСиндСксированныС

МоТно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΊΠ°Ρ€ΠΌΠ°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ индСксированы (ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ add):

git stash save --keep-index

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС:

               (wt)
               (i)       
A - B - C - D - ?         ?
            ↑             ↑
          master      stash{0}
          (HEAD)

3.1.2 Π˜Π½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° отмСняСт всС индСксированныС ΠΈ нСиндСксированныС измСнСния Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области, сохраняя ΠΈΡ… Π² ΠΊΠ°Ρ€ΠΌΠ°Π½ (stash).

git stash save

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС:

           (wt)
           (i)           
A - B - C - D             ?
            ↑             ↑
          master      stash{0}
          (HEAD)

    ВосстановлСниС нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: Π»Π΅Π³ΠΊΠΎ ΠΈ просто.

git stash apply

Если stash совсСм Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

# ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ послСднюю запись ΠΊΠ°Ρ€ΠΌΠ°Π½Π°
git stash drop

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ использованиС stash.

ПослС этого Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ измСнСния всё Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ слоТнСС: How to recover a dropped stash in Git?
3.2 ΠžΠΏΠ°ΡΠ½Ρ‹ΠΉ способ

    ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎ! Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ удаляСт нСсохранСнныС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ измСнСния ΠΈΠ· Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области ΠΈ ΠΈΠ· индСкса Если ΠΎΠ½ΠΈ Π²Π°ΠΌ всС-Ρ‚Π°ΠΊΠΈ Π½ΡƒΠΆΠ½Ρ‹, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ git stash.

    ВосстановлСниС нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: нСиндСксированныС потСряны ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ проиндСксировано.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ git reset --hard

ВыполняСм:

git reset --hard HEAD

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС:

           (wt)
           (i)
A - B - C - D - Ρ… - Ρ…
            ↑
          master
          (HEAD)

4. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρƒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ (Π½Π΅ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅)

    ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎ! Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° пСрСписываСт ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Git-рСпозитория. Если Π²Ρ‹ ΡƒΠΆΠ΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ (git push) свои измСнСния, Ρ‚ΠΎ этот способ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСльзя (см. ΠΏΠΎΡ‡Π΅ΠΌΡƒ). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ· ΠΏΡƒΠ½ΠΊΡ‚Π° 5 (git revert).

4.1 ΠŸΡ€ΠΈ этом ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния Π² индСкс рСпозитория:

git reset --soft bbbbbb

ПослС этого индСкс рСпозитория Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС измСнСния ΠΎΡ‚ cccccc Π΄ΠΎ dddddd. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ (ΠΈΠ»ΠΈ нСсколько) Π½Π° основС этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

           (wt)
           (i)
A - B - C - D 
    ↑
  master
  (HEAD)

4.2 Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ области, Π½ΠΎ Π½Π΅ Π² индСксС.

git reset bbbbbb

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° просто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²Π΅Ρ‚ΠΊΠΈ, Π½ΠΎ Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ измСнСния Π² индСксС (ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ пустым).

   (i)     (wt)
A - B - C - D 
    ↑
  master
  (HEAD)

4.3 ΠŸΡ€ΠΎΡΡ‚ΠΎ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ измСнСния.

    ΠžΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎ! Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ удаляСт нСсохранСнныС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ измСнСния. Если удаляСмыС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ потСряны.

    ВосстановлСниС ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ git reflog ΠΈ этот вопрос Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹; ΠΈΠ½Π°Ρ‡Π΅ сборщик мусора ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΈΡ… Π±Π΅Π·Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя.

    ВосстановлСниС нСсохранСнных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: нСиндСксированныС потСряны ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ проиндСксировано.

ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС:

               (i) (wt)
A - B - C - D - ? -  ?
            ↑
          master
          (HEAD)

ВыполняСм:

git reset --hard bbbbbb

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС:

   (wt)
   (i)
A - B - C - D - Ρ… - Ρ…
    ↑
  master
  (HEAD)

5. ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ git revert. Она создаСт Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ отмСняСмый ΠΊΠΎΠΌΠΌΠΈΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ послС aaaaaa:

# ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ отмСняСмыС ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹
git revert bbbbbb cccccc dddddd

# ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅Π³ΠΎ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌΡƒ (Π½ΠΎΠ²ΠΎΠΌΡƒ)
git revert bbbbbb..dddddd

# Π»ΠΈΠ±ΠΎ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ссылках
git revert HEAD~2..HEAD

# ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚ слияния, указывая явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄ΠΊΠ° (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°ΠΊΠΈΡ… Π½Π΅Ρ‚):
git revert -m 1 abcdef

# послС этого ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚Π΅ измСнСния:
git commit -m'Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ сдСлано'

Submodules

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для подтягивания зависимостСй сторонних Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с двумя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

НапримСр, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ git@github.com:nEST-Projects/burp-extension-jy-dependency-example.git.

$ git submodule add --name pydep git@github.com:nEST-Projects/burp-extension-jy-dependency-example.git dependencies/pydep

ПослС Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: git submodule update --init (Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ .gitsubmodule Ρ„Π°ΠΉΠ»; dependecies ΠΊΠ°ΠΊ дирСктория Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ проиндСксирована) Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ dependecies/pydep затянСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

SSL certificate problem: self signed certificate in certificate chain Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΡƒΡˆΠΈΠΌ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π½ΠΎ Ρ‚ΠΊ сСрт самоподписанный, Ρ‚ΠΎ git Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ РСшСниС:

$ git config http.sslVerify "false"
ΠΈΠ»ΠΈ
$ git -c http.sslVerify=false clone https://...

Git GUI

SourceTree β€” https://www.sourcetreeapp.com/

Github Desktop.

Last updated