Rozgałęzienie z poprzedniego zatwierdzenia za pomocą Git

1797

Jeśli mam n zatwierdzeń, jak mogę rozgałęzić się od zatwierdzenia n-3?

Widzę skrót każdego zatwierdzenia.

Doug
źródło

Odpowiedzi:

2543

Możesz utworzyć oddział za pomocą skrótu:

git branch branchname <sha1-of-commit>

Lub używając symbolicznego odniesienia:

git branch branchname HEAD~3

Aby pobrać gałąź podczas jej tworzenia, użyj

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
źródło
42
Git 1.8.2 pozwól mi użyć krótkiego sha1 dla pierwszej formy.
Dan Benamy,
53
@MattFenwick Git pozwoli ci używać skróconych skrótów wszędzie, gdzie dozwolony jest skrót, pod warunkiem, że skrócony skrót jest „unikalny” w repozytorium. Więc jeśli to nie zadziała, spróbuj dodać kolejną postać z skrótu.
poke
29
Aby poprawnie wypchnąć nowy oddział na serwer .. potrzebny był ten ostatni krok:git push origin BRANCH_NAME
Gene Bo
3
aby uruchomić gałąź od <sha1-of-commit>uruchomienia, git checkout -b <name-of-branch> <sha1-of-commit>ale jeśli gałąź już istniejegit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Aby to zrobić na github.com:

  1. Idź do swojego projektu.
  2. Kliknij „Commits”.
  3. Kliknij <> („Przeglądaj repozytorium w tym punkcie historii”) na zatwierdzeniu, z którego chcesz rozgałęzić się.
  4. Kliknij „drzewo: xxxxxx” w lewym górnym rogu. Tuż pod paskiem statystyk języka pojawi się opcja „Znajdź lub utwórz oddział” (wystarczy wpisać tam nową nazwę oddziału)Oddział z poprzedniego zatwierdzenia
OneSolitaryNoob
źródło
4
Pytanie nie dotyczy github, ale git. Większość serwerów git nie jest github.
Anders Tornblad
46
Pomimo faktu, że jest to Github, nie git, wciąż był niezwykle pomocny!
Liz
Niestety wciąż pokazuje zmiany od innych zmian, których chciałem uniknąć, dlatego szukałem tego pytania
Maxim,
83

Magię można wykonać za pomocą git reset .

  1. Utwórz nowy oddział i przełącz się na niego (aby wszystkie najnowsze zatwierdzenia były tutaj przechowywane)

    git checkout -b your_new_branch

  2. Wróć do poprzedniej działającej gałęzi (zakładając, że jest to master)

    git checkout master

  3. Usuń ostatnie x zatwierdzeń, utrzymuj master w czystości

    git reset --hard HEAD~x # in your case, x = 3

Od tego momentu wszystkie ostatnie x zatwierdzeń znajdują się tylko w nowej gałęzi, a nie w poprzedniej działającej gałęzi (master).

Jing Li
źródło
7
Właśnie tego szukałem, ponieważ usuwa on zatwierdzenia z Mistrza i sprawia, że ​​pamiętacie, jak zrobić gałąź przed dokonaniem tych zatwierdzeń. Dzięki.
superbeck
7
Tylko nie zapominaj, że a git reset --hardnie jest dobrym pomysłem, jeśli już zepchnąłeś zobowiązanie do powstania ...
LuisF
1
możesz, git push --force jeśli już wcześniej pchnąłeś gałąź
Milan
Ale bądź bardzo ostrożny, używając --force blog.developer.atlassian.com/force-with-lease
peater
74

Jeśli nie masz pewności, z którego zatwierdzenia chcesz rozgałęzić się z wyprzedzeniem, możesz sprawdzić zatwierdzenia i zbadać ich kod (patrz źródło, kompilacja, test) przez

git checkout <sha1-of-commit>

po znalezieniu zatwierdzenia, które chcesz rozgałęzić, możesz to zrobić z zatwierdzenia (tzn. bez powrotu do głównego), po prostu tworząc gałąź w zwykły sposób:

git checkout -b <branch_name>
stanm
źródło
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
źródło
1
Czym różni się to od „ git branch branchname <sha1-of-commit>” (od zaakceptowanej odpowiedzi)?
Peter Mortensen
Nie wiem Myślę, że są równoważne. Zawsze używam git checkout -bdo tworzenia nowego oddziału.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 gałąź git ... tworzy gałąź, ale pozostawia cię w bieżącej gałęzi. git checkout -b ... tworzy gałąź i przełącza do niej.
esme_louise
9

Szybki sposób na wykonanie tego w repozytorium Github byłby następujący:

  • Znajdź konkretny zatwierdzenie z oddziału
  • Obok identyfikatora SHA kliknij „Przeglądaj repozytorium w tym momencie w historii”
  • Tutaj możesz utworzyć nowy oddział z tego zatwierdzenia wprowadź opis zdjęcia tutaj
Vatsal Parekh
źródło
1
To jest naprawdę nieaktualne
regetskcob
2
Pytanie nie dotyczy githubu.
Anders Tornblad
8

Po prostu uruchom:

git checkout -b branch-name <commit>

Na przykład :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

checkoutPolecenie z parametrem -bbędzie tworzyć nowy oddział I będzie się przełączać cię do niego

d1jhoni1b
źródło
1
Ten bardzo mi się podoba. Dzięki
Błazen
czy możliwe jest utworzenie gałęzi na podstawie zatwierdzenia SHA gałęzi funkcji, która została usunięta poprzez żądanie ściągnięcia? Czy też muszę rozgałęziać się od zatwierdzenia żądania ściągnięcia na master?
user2966445,
uruchom git fetchi git branchpolecenie w folderze projektu za pomocą terminala, a następnie sprawdź, czy gałąź funkcji istnieje, jeśli tak, to tak, oczywiście nie będzie można utworzyć gałęzi z usuniętych gałęzi, możesz również cofnąć usunięcie gałęzi, jeśli oddział zniknął
d1jhoni1b
4

Świetnie powiązane pytanie brzmi: jak do cholery wymyśliłeś to, używając --helpopcji git? Spróbujmy tego:

git branch --help

Widzimy ten wynik:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Wyszukaj w kolejnym tekście słowo „zatwierdzenie”. Znajdujemy to:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

Dostajemy gdzieś!

Teraz skup się na tej linii gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Kondensuj to do tego:

git branch <branchname> [<start-point>]

I zrobione.

Purplejacket
źródło
1
Nienawidzę Gita. Dzięki.
Byron Whitlock
4

Aby to zrobić w Eclipse:

  • Przejdź do perspektywy „Eksploracja repozytorium Git”.
  • Rozwiń „Tagi” i wybierz zatwierdzenie, z którego chcesz utworzyć oddział.
  • Kliknij zatwierdzenie prawym przyciskiem myszy i wybierz „Utwórz gałąź”.
  • Podaj nazwę oddziału.

Stworzy dla ciebie lokalny oddział. Następnie za każdym razem, gdy wprowadzasz zmiany, twoja gałąź będzie wypychana na zdalny serwer.

Saurabhcdt
źródło
3

Możesz to zrobić w Skrytce.

  1. Kliknij zatwierdzenie
  2. W prawym górnym rogu ekranu kliknij „Tag this commit”
  3. Następnie możesz utworzyć nowy oddział na podstawie właśnie utworzonego tagu.
David Ruan
źródło
Co to jest GUI? GitHub?
ostrichofevil,
Atlassian Stash
David Ruan
3

Byłem w stanie to zrobić tak:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Gdzie musisz wpisać wartość pominięcia. 0 oznacza ostatni, 1 poprzedni, 2 poprzedni, itd.

Mike Graf
źródło
4
Dlaczego nie po prostu użyć HEAD~1(gdzie 1 oznacza 1 zatwierdzenie z powrotem)?
jduncanator
1
Twoja droga jest objęta wybraną odpowiedzią i działa dobrze. Mój jest inny sposób niż wybrana odpowiedź.
Mike Graf
3

To tworzy gałąź za pomocą jednego polecenia:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Wolę ten sposób lepiej niż te opublikowane powyżej, ponieważ tworzy on gałąź natychmiast (nie wymaga później dodatkowej komendy push).

Alexander Samoylov
źródło
3

Korzystanie z Sourcetree | Najłatwiejszy sposób.

  • Najpierw sprawdź gałąź, w której chcesz wykonać określony zatwierdzenie, aby utworzyć nową gałąź.
  • Następnie spójrz na pasek narzędzi, wybierz Repozytorium> Oddział ... skrót to Command + Shift + B.
  • I wybierz konkretne zatwierdzenie, które chcesz wziąć. I podaj nową nazwę oddziału, a następnie utwórz gałąź!

wprowadź opis zdjęcia tutaj

Dary
źródło
w końcu znalazłem tę przydatną odpowiedź. Dzięki
Firda Sahidi,
1

Oto co zrobiłem:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

W tym przypadku 8a75b001096536b3216022484af3026aa9c7bb5bbył i stary commit należący do masteroddziału.

Jaime Montoya
źródło
1

Przejdź do konkretnego zatwierdzenia repozytorium git

Czasami pracując nad repozytorium git, chcesz wrócić do określonego zatwierdzenia (rewizji), aby mieć migawkę swojego projektu w określonym czasie. Aby to zrobić, potrzebujesz skrótu SHA-1 zatwierdzenia, który można łatwo znaleźć sprawdzając dziennik za pomocą polecenia:

git log --abbrev-commit --pretty=oneline

który da ci zwartą listę wszystkich zatwierdzeń i krótką wersję skrótu SHA-1.

Teraz, gdy znasz skrót do zatwierdzenia, do którego chcesz przejść, możesz użyć jednego z następujących 2 poleceń:

git checkout HASH

lub

git reset --hard HASH

sprawdzić

git checkout <commit> <paths>

Mówi gitowi, aby zastąpił bieżący stan ścieżek ich stanem w danym zatwierdzeniu. Ścieżki mogą być plikami lub katalogami.

Jeśli nie podano gałęzi, git zakłada zatwierdzenie HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Jeśli nie podano ścieżki, git przechodzi HEADdo podanego zatwierdzenia (zmieniając tym samym zatwierdzenie, nad którym siedzisz i pracujesz).

git checkout branch //means switching branches.

Resetowanie

git reset <commit> //re-sets the current pointer to the given commit.

Jeśli jesteś na gałęzi (zwykle powinieneś być), HEADa gałąź ta jest przenoszona do zatwierdzenia.

Jeśli jesteś w HEADstanie odłączonym , git reset się porusza HEAD. Aby zresetować gałąź, najpierw ją sprawdź.

Jeśli chcesz dowiedzieć się więcej o różnicy między resetem git a kasą git, polecam przeczytać oficjalny blog git .

Lyes CHIOUKH
źródło
2
dziękuję za odpowiedź, FYI: To: git log --abbrev-commit --pretty=oneline może być skróconegit log --oneline
Suhaib
0

Wybierz Zatwierdź

Dla użytkowników Git GUI możesz wizualizować całą historię (jeśli to konieczne), a następnie kliknąć prawym przyciskiem myszy zatwierdzenie, z którego chcesz rozgałęzić i wprowadzić nazwę oddziału.

Wpisz nazwę oddziału

Wizualizuj całą historię

Ivan
źródło
Działa
Zgadza się. Moja odpowiedź zaczyna się od słów „Dla użytkowników Git GUI ...”. Nie dałem odpowiedzi, która zadziała dla wszystkich - to już zrobione. Podałem alternatywną metodę, która może być łatwiejsza dla wielu osób. Myślę, że powodem, dla którego moja odpowiedź nie podobała się, jest to, że nie jest to rozwiązanie dla wszystkich, ale istnieje już przy kilku tysiącach pozytywnych opinii. Jednak to nie czyni mojej odpowiedzi błędną „Dla użytkowników Git GUI!”. CREATE NEW BRANCH jest dostępne w GUI. Wątpię, że jestem jedyną osobą na świecie, która go używa!
Ivan
0

Aby wykonać zaakceptowaną odpowiedź w programie Visual Studio 2015 i 2017:

Kliknij zmiany

Kliknij zmiany (czerwona strzałka powyżej)

Kliknij opcję Działania, aby wyświetlić historię

Kliknij opcję Działania (czerwona strzałka powyżej) i kliknij opcję Wyświetl historię w menu DropDown

I otworzy się nowa karta:

Karta Historia

I powinieneś kliknąć prawym przyciskiem myszy poprzednie zatwierdzenie, do którego chcesz przywrócić kod: kliknij poprzedni zatwierdzenie prawym przyciskiem myszy

Wybierz do kasy nowego oddziału i voilá!

Poniżej, choć nie jest to pytanie OP, ale robię dużo, a ten jest podstępny, przynajmniej dla mnie: jeśli chcesz powrócić do poprzedniego zatwierdzenia, bez kasy nowego oddziału, NIE wybieraj cofania (! ?); powinieneś wybrać przedefiniowanie - zmieszany lub - twardy:

kliknij prawym przyciskiem myszy poprzednie zatwierdzenie i ponownie zdefiniuj

Marcelo Scofano
źródło
Proszę podzielić się swoimi odpowiedziami w języku angielskim, ponieważ większość z nas nie mówi ani nie zna innych języków obcych niż angielski.
Shamiul Hasan Rumman
@ShamiulHasanRumman, w tekście wyjaśniającym obrazy - zwykle poniżej - przetłumaczyłem wskazany termin Czerwonej Strzałki na angielski, tak jak kliknięcie w Działania (czerwona strzałka powyżej) To nie wystarczyło?
Marcelo Scofano
@MarceloScofano, czy trudno było zmienić edytor w języku angielskim przed zrobieniem zrzutów ekranu?
Andrew Surdu,
1
@AndreiSurdu: ponieważ nigdy nie miałem takiej potrzeby, spodziewałem się, że aby przejść na angielski, muszę zainstalować dodatkowy pakiet. Ale masz rację, potrzebuje tylko ponownego uruchomienia VS, bez instalacji. Spróbuję zmienić powyższe zdjęcia, jak tylko będę miał wolny czas.
Marcelo Scofano
0

jeśli używasz drzewa źródeł, które jest dość proste.

  • Kliknij zatwierdzenie prawym przyciskiem myszy, z którego chcesz utworzyć nowy oddział
  • Kliknij na „oddział”
  • Wpisz nazwę nowej gałęzi w wyświetlonym oknie dialogowym i kliknij „utwórz gałąź”
Ibtisam Asif
źródło
0

Jeśli szukasz rozwiązania opartego na wierszu poleceń, możesz zignorować moją odpowiedź. Sugeruję, abyś użył GitKraken . To niezwykły klient interfejsu git. Pokazuje drzewo Git na stronie głównej. Możesz po prostu na nie spojrzeć i wiedzieć, co się dzieje z projektem. Wystarczy wybrać konkretny zatwierdzenie, kliknąć go prawym przyciskiem myszy i wybrać opcję „Utwórz gałąź tutaj”. Zostanie wyświetlone pole tekstowe do wprowadzenia nazwy oddziału. Wpisz nazwę oddziału, wybierz „OK” i gotowe. Jest naprawdę bardzo łatwy w użyciu.

Shamiul Hasan Rumman
źródło