Verzweigen Sie mit Git von einem früheren Commit

1798

Wie kann ich vom n-3-Commit verzweigen, wenn ich n Commits habe?

Ich kann den Hash jedes Commits sehen.

Dole Doug
quelle

Antworten:

2547

Sie können den Zweig über einen Hash erstellen:

git branch branchname <sha1-of-commit>

Oder unter Verwendung einer symbolischen Referenz:

git branch branchname HEAD~3

Verwenden Sie zum Auschecken des Zweigs beim Erstellen

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
quelle
42
Git 1.8.2 lass mich das kurze sha1 für das erste Formular verwenden.
Dan Benamy
53
Mit @MattFenwick Git können Sie verkürzte Hashes überall dort verwenden, wo ein Hash zulässig ist, solange der verkürzte Hash im Repository "eindeutig" ist. Wenn es nicht funktioniert hat, fügen Sie ein weiteres Zeichen aus dem Hash hinzu.
stupsen
29
Um den neuen Zweig korrekt auf den Server zu übertragen, wurde dieser letzte Schritt benötigt:git push origin BRANCH_NAME
Gene Bo
3
um einen Zweig von <sha1-of-commit>run zu starten , git checkout -b <name-of-branch> <sha1-of-commit>aber wenn der Zweig bereits existiertgit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Um dies auf github.com zu tun:

  1. Gehen Sie zu Ihrem Projekt.
  2. Klicken Sie auf "Commits".
  3. Klicken Sie im Commit, von dem aus Sie verzweigen möchten, auf <> ("Durchsuchen Sie das Repository zu diesem Zeitpunkt im Verlauf").
  4. Klicken Sie oben links auf "Baum: xxxxxx". Direkt unter der Sprachstatistikleiste erhalten Sie die Option "Zweig suchen oder erstellen" (geben Sie dort einfach einen neuen Zweignamen ein).Vom vorherigen Commit abzweigen
OneSolitaryNoob
quelle
4
Die Frage ist nicht über Github, sondern über Git. Die meisten Git-Server sind keine Github.
Anders Tornblad
46
Trotz der Tatsache, dass dies Github nicht git ist, war es immer noch immens hilfreich!
Liz
Leider zeigt es immer noch Änderungen von anderen Commits, die ich vermeiden wollte, weshalb ich nach dieser Frage gesucht habe
Maxim
83

Die Magie kann durch Git-Reset erfolgen .

  1. Erstellen Sie einen neuen Zweig und wechseln Sie zu diesem (damit alle Ihre neuesten Commits hier gespeichert werden).

    git checkout -b your_new_branch

  2. Wechseln Sie zurück zu Ihrem vorherigen Arbeitszweig (nehmen Sie an, dass es sich um einen Master handelt).

    git checkout master

  3. Entfernen Sie die neuesten x-Commits und halten Sie den Master sauber

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

Ab diesem Moment befinden sich alle neuesten x-Commits nur noch in der neuen Verzweigung, nicht mehr in Ihrer vorherigen Arbeitsniederlassung (Master).

Jing Li
quelle
7
Dies ist, wonach ich gesucht habe, da es die Commits vom Master entfernt und es so macht, als hätten Sie daran gedacht, den Zweig zu machen, bevor diese Commits gemacht wurden. Vielen Dank.
Superbeck
7
Vergessen Sie nur nicht, dass a git reset --hardkeine gute Idee ist, wenn Sie das Commit bereits auf Ursprung gebracht haben ...
LuisF
1
Sie können, git push --force wenn Sie die Niederlassung bereits zuvor geschoben hatten
Mailand
Aber seien Sie wirklich vorsichtig, wenn Sie --force blog.developer.atlassian.com/force-with-lease
peater verwenden.
74

Wenn Sie sich nicht sicher sind, von welchem ​​Commit Sie im Voraus verzweigen möchten, können Sie Commits auschecken und ihren Code (siehe Quelle, Kompilieren, Testen) von überprüfen

git checkout <sha1-of-commit>

Sobald Sie das Commit gefunden haben, von dem Sie verzweigen möchten, können Sie dies innerhalb des Commits tun (dh ohne zuerst zum Master zurückzukehren), indem Sie einfach eine Verzweigung auf die übliche Weise erstellen:

git checkout -b <branch_name>
stanm
quelle
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
quelle
1
Wie unterscheidet sich das von " git branch branchname <sha1-of-commit>" (von der akzeptierten Antwort)?
Peter Mortensen
Ich weiß es nicht. Ich denke, sie sind gleichwertig. Ich benutze immer git checkout -b, um einen neuen Zweig zu erstellen.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 git branch ... erstellt den Zweig, lässt Sie jedoch im aktuellen Zweig. git checkout -b ... erstellt den Zweig und wechselt zu ihm.
esme_louise
9

Ein schneller Weg, dies auf Ihrem Github-Repo zu tun, wäre wie folgt:

  • Finden Sie das spezifische Commit in Ihrer Niederlassung
  • Klicken Sie neben der SHA-ID auf "Repo an dieser Stelle im Verlauf durchsuchen".
  • Hier können Sie aus diesem Commit einen neuen Zweig erstellen Geben Sie hier die Bildbeschreibung ein
Vatsal Parekh
quelle
1
Dies ist eigentlich veraltet
regetskcob
2
Die Frage ist nicht über Github.
Anders Tornblad
8

Einfach ausführen:

git checkout -b branch-name <commit>

Beispielsweise :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

Der checkoutBefehl mit dem Parameter -berstellt einen neuen Zweig UND schaltet Sie darauf um

d1jhoni1b
quelle
1
Ich mag dieses sehr. Danke
Der Narr
Ist es möglich, einen Zweig basierend auf dem SHA-Commit eines Feature-Zweigs zu erstellen, der über eine Pull-Anforderung gelöscht wurde? Oder muss ich vom Commit der Pull-Anfrage auf Master verzweigen?
user2966445
Führen Sie git fetch& git branchcommand im Ordner Ihres Projekts über das Terminal aus und überprüfen Sie, ob der Feature-Zweig vorhanden ist. Wenn dies der Fall ist, können Sie natürlich keinen Zweig aus gelöschten Zweigen erstellen. Sie können auch einen Zweig löschen, falls der Zweig ist weg
d1jhoni1b
4

Eine gute verwandte Frage ist: Wie zum Teufel finden Sie das mit der --helpOption Git heraus? Lass uns das versuchen:

git branch --help

Wir sehen diese Ausgabe:

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.

Durchsuchen Sie den nachfolgenden Text nach dem Wort "Festschreiben". Wir finden das:

   <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.

Wir kommen irgendwohin!

Konzentrieren Sie sich nun auf diese Zeile des Gobbledegooks:

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

Verdichten Sie das dazu:

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

Und fertig.

Lila Jacke
quelle
1
Ich hasse git. Vielen Dank.
Byron Whitlock
4

So tun Sie dies in Eclipse:

  • Gehen Sie zur Perspektive "Git Repository Exploring".
  • Erweitern Sie "Tags" und wählen Sie das Commit aus, aus dem Sie einen Zweig erstellen möchten.
  • Klicken Sie mit der rechten Maustaste auf das Commit und wählen Sie "Zweig erstellen".
  • Geben Sie einen Filialnamen an.

Es wird eine lokale Niederlassung für Sie erstellt. Wenn Sie dann Ihre Änderungen übertragen, wird Ihr Zweig auf den Remote-Server übertragen.

Saurabhcdt
quelle
3

Sie können es in Stash tun.

  1. Klicken Sie auf das Commit
  2. Klicken Sie oben rechts auf dem Bildschirm auf "Dieses Commit markieren".
  3. Anschließend können Sie den neuen Zweig aus dem gerade erstellten Tag erstellen.
David Ruan
quelle
Welche GUI ist das? GitHub?
Straußofevil
Atlassian Stash
David Ruan
3

Ich konnte es so machen:

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

Hier müssen Sie den Sprungwert eingeben. 0 ist die letzte, 1 ist die vorherige, 2 ist das Commit davor usw.

Mike Graf
quelle
4
Warum nicht einfach verwenden HEAD~1(wobei 1 1 Commit Back angibt)?
JDUNcanator
1
Ihr Weg wird durch die ausgewählte Antwort abgedeckt und funktioniert einwandfrei. Meins ist ein anderer Weg als die ausgewählte Antwort.
Mike Graf
3

Dadurch wird der Zweig mit einem Befehl erstellt:

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

Ich bevorzuge diesen Weg besser als die oben veröffentlichten, da er den Zweig sofort erstellt (erfordert danach keinen zusätzlichen Push-Befehl).

Alexander Samoylov
quelle
3

Verwenden von Sourcetree | Der einfachste Weg.

  • Überprüfen Sie zunächst den Zweig, für den Sie das spezifische Commit ausführen möchten, um einen neuen Zweig zu erstellen.
  • Schauen Sie dann in der Symbolleiste nach, wählen Sie Repository> Verzweigen ... die Verknüpfung lautet Befehl + Umschalt + B.
  • Und wählen Sie das spezifische Commit aus, das Sie ausführen möchten. Und geben Sie einen neuen Filialnamen ein und erstellen Sie eine Filiale!

Geben Sie hier die Bildbeschreibung ein

Dary
quelle
fand endlich diese nützliche Antwort. Vielen Dank
Firda Sahidi
1

Das habe ich getan:

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

In diesem Fall 8a75b001096536b3216022484af3026aa9c7bb5bgehörte ein altes Commit zur masterFiliale.

Jaime Montoya
quelle
1

Wechseln Sie zu einem bestimmten Commit eines Git-Repositorys

Wenn Sie an einem Git-Repository arbeiten, möchten Sie manchmal zu einem bestimmten Commit (Revision) zurückkehren, um zu einem bestimmten Zeitpunkt einen Snapshot Ihres Projekts zu erhalten. Um dies alles zu tun, benötigen Sie den SHA-1-Hash des Commits, den Sie leicht finden können, indem Sie das Protokoll mit dem folgenden Befehl überprüfen:

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

Dadurch erhalten Sie eine kompakte Liste aller Commits und die Kurzversion des SHA-1-Hash.

Nachdem Sie den Hash des Commits kennen, zu dem Sie wechseln möchten, können Sie einen der folgenden 2 Befehle verwenden:

git checkout HASH

oder

git reset --hard HASH

Auschecken

git checkout <commit> <paths>

Weist git an, den aktuellen Status von Pfaden durch ihren Status im angegebenen Commit zu ersetzen. Pfade können Dateien oder Verzeichnisse sein.

Wenn kein Zweig angegeben ist, übernimmt git das HEAD-Commit.

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

Wenn kein Pfad angegeben ist, bewegt sich git HEADzum angegebenen Commit (wodurch das Commit geändert wird, an dem Sie sitzen und arbeiten).

git checkout branch //means switching branches.

zurücksetzen

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

Wenn Sie sich in einem Zweig befinden (dies sollte normalerweise der Fall sein) HEADund dieser Zweig zum Festschreiben verschoben wird.

Wenn Sie sich in einem getrennten HEADZustand befinden, wird der Git-Reset nur verschoben HEAD. Um einen Zweig zurückzusetzen, checken Sie ihn zuerst aus.

Wenn Sie mehr über den Unterschied zwischen Git-Reset und Git-Checkout erfahren möchten, würde ich empfehlen, den offiziellen Git-Blog zu lesen .

Lyes CHIOUKH
quelle
2
Vielen Dank für Ihre Antwort, FYI: Dies: git log --abbrev-commit --pretty=oneline kann abgekürzt werdengit log --oneline
Suhaib
0

Wählen Sie Commit

Für Git-GUI-Benutzer können Sie den gesamten Verlauf (falls erforderlich) visualisieren und dann mit der rechten Maustaste auf das Commit klicken, von dem Sie verzweigen möchten, und den Verzweigungsnamen eingeben.

Geben Sie den Filialnamen ein

Visualisieren Sie den gesamten Verlauf

Ivan
quelle
Dies funktioniert nur, wenn Benutzer ein UI-basiertes Betriebssystem wie Windows & MAC
Saurabhcdt
Das stimmt. Meine Antwort beginnt speziell mit den Worten "Für Git-GUI-Benutzer ...". Ich habe keine Antwort gegeben, die für alle funktionieren wird - das ist bereits erledigt. Ich habe eine alternative Methode angegeben, die für viele Menschen einfacher sein könnte. Ich denke, der Grund, warum meine Antwort nicht gemocht wird, ist, dass es nicht für jeden eine Lösung ist, aber das gibt es bereits mit ein paar tausend positiven Stimmen. Das macht meine Antwort jedoch nicht falsch "Für Git-GUI-Benutzer!". CREATE NEW BRANCH gibt es in der GUI. Ich bezweifle, dass ich die einzige Person auf der Welt bin, die es benutzt!
Ivan
0

So führen Sie die akzeptierte Antwort in Visual Studio 2015 und 2017 aus:

Klicken Sie auf Änderungen

Klicken Sie auf Änderungen (roter Pfeil oben)

Klicken Sie auf Aktionen, um den Verlauf anzuzeigen

Klicken Sie auf Aktionen (roter Pfeil oben) und dann im DropDown-Menü auf Verlauf anzeigen

Und der neue Tab wird geöffnet:

Registerkarte "Verlauf"

Und Sie sollten mit der rechten Maustaste auf das vorherige Commit klicken, auf das Ihr Code zurückgesetzt werden soll: Klicken Sie mit der rechten Maustaste auf das vorherige Commit

Wählen Sie eine neue Filiale und voilá!

Unten, obwohl nicht Teil der OP-Frage, aber ich mache viel und dieser ist ein Trickschritt, zumindest für mich: Wenn Sie zu einem vorherigen Commit zurückkehren möchten, ohne einen neuen Zweig auszuchecken, wählen Sie NICHT Zurücksetzen (! ?); Sie sollten --mixed oder --hard neu definieren:

Klicken Sie mit der rechten Maustaste auf das vorherige Commit und definieren Sie es neu

Marcelo Scofano
quelle
Bitte teilen Sie Ihre Antworten auf Englisch mit, da die meisten von uns hier keine anderen Fremdsprachen als Englisch sprechen oder sprechen.
Shamiul Hasan Rumman
@ShamiulHasanRumman, in dem Text, der die Bilder erklärt - normalerweise unten - habe ich den spitzen Begriff mit dem roten Pfeil ins Englische übersetzt. Klicken Sie in Aktionen (roter Pfeil oben). Es war nicht genug?
Marcelo Scofano
@MarceloScofano, war es schwierig, den Editor auf Englisch zu wechseln, bevor die Screenshots gemacht wurden?
Andrew Surdu
1
@AndreiSurdu: Da ich das nie nötig hatte, hatte ich erwartet, dass ich ein zusätzliches Paket installieren musste, um auf Englisch zu wechseln. Aber Sie haben Recht, es muss nur ein VS-Neustart durchgeführt werden, überhaupt keine Installation. Ich werde versuchen, die obigen Bilder zu ändern, sobald ich Freizeit habe.
Marcelo Scofano
0

Wenn Sie den Quellbaum verwenden, ist das ziemlich einfach.

  • Klicken Sie mit der rechten Maustaste auf das Commit, von dem aus Sie einen neuen Zweig erstellen müssen
  • Klicken Sie auf "Zweig"
  • Geben Sie im Dialogfeld den Namen des neuen Zweigs ein und klicken Sie auf "Zweig erstellen".
Ibtisam Asif
quelle
0

Wenn Sie nach einer befehlszeilenbasierten Lösung suchen, können Sie meine Antwort ignorieren. Ich werde Ihnen vorschlagen, GitKraken zu verwenden . Es ist ein außergewöhnlicher Git-UI-Client. Es zeigt den Git-Baum auf der Homepage. Sie können sie sich einfach ansehen und wissen, was mit dem Projekt los ist. Wählen Sie einfach ein bestimmtes Commit aus, klicken Sie mit der rechten Maustaste darauf und wählen Sie die Option "Hier einen Zweig erstellen". Sie erhalten ein Textfeld zur Eingabe des Filialnamens. Geben Sie den Filialnamen ein, wählen Sie 'OK' und Sie sind fertig. Es ist wirklich sehr einfach zu bedienen.

Shamiul Hasan Rumman
quelle