Git ziehen bis zu einem bestimmten Commit


96

Ich möchte ein git pullaber nur bis zu einem bestimmten Commit machen.

 A->B->C->D->E->F (Remote master HEAD)

Nehmen wir also an, mein local masterKOPF zeigt auf Bund ich möchte bis ziehen E. Was soll ich machen ?

Dies führt nicht zu einem bestimmten Commit, sondern zu einem bestimmten Commit.



3
git fetchund git merge E.
stupsen

Ich bin derzeit zum Beispiel in B, aber ich möchte nur C, E und F ziehen. Ich möchte D entfernen. Danke!
Frenkey

@Frenkey Sie können den Master zusammenführen, dann die letzten drei Commits entfernen und dann die letzten beiden auswählen. Sie können auch Rebase -i für eine kontrollierte Git-Zusammenführung
ausprobieren

Was ist, wenn ich nur Änderungen von C abrufen möchte, keine Änderungen von A und B nur von C? Wie kann ich das machen?
Vikas Chauhan

Antworten:


113

git pullist nichts anderes als git fetchgefolgt von git merge. Was Sie also tun können, ist

git fetch remote example_branch

git merge <commit_hash>


Was soll das "Beziehen Sie sich darauf" sein?
Entwickler

@Brett Ich habe vergessen, den Link zu posten. Ich habe ihn komplett entfernt
unrealsoul007

@ unrealsoul007 dies wird nur das eine bestimmte Commit zusammenführen, oder? Um von B nach E zu ziehen, wäre der Befehl git merge <commit_hash C> <commit_hash D> <commit_hash E> richtig?
Wim Feijen

6
@WimFeijen git merge Ewird Emit all seinen Vorfahren zusammengeführt Cund D(git weiß das Aund Bmuss nicht zusammengeführt werden, weil sie bereits in Ihrem Zweig waren). Wenn Sie NUR die Änderungen von möchten E, sollten Sie git cherry-pick Estattdessen.
neXus

Vielen Dank für die Antwort, ich habe nach dem gleichen Problem gesucht.
Akash Bisariya

20

Rufen Sie zunächst die neuesten Commits vom Remote-Repo ab. Dies hat keine Auswirkungen auf Ihre lokale Niederlassung.

git fetch origin

Überprüfen Sie dann den Remote-Tracking-Zweig und erstellen Sie ein Git-Protokoll, um die Commits anzuzeigen

git checkout origin/master
git log

Holen Sie sich den Commit-Hash des Commits, zu dem Sie zusammenführen möchten (oder nur die ersten ~ 5 Zeichen davon), und führen Sie diesen Commit zum Master zusammen

git checkout master
git merge <commit hash>

1
Ich habe Sie abgelehnt, weil dies nicht wie angekündigt funktioniert. Zunächst werden mit Ihrer Methode "git fetch origin" alle entfernten Zweige abgerufen (dies sollte ausdrücklich hervorgehoben werden, insbesondere für Personen, die in Projekten mit vielen und großen Zweigen arbeiten). Zweitens führt "git merge <Commit-Hash>" mit dieser Methode Ihren lokalen Verlauf nicht bis zum gewünschten Commit zusammen, wenn Sie wieder im Verlauf sind. Beispiel: Sie befinden sich lokal bei Commit 100, Sie möchten bis zu 150 erreichen, indem Sie alles abrufen (wobei Remote HEAD bei 100 liegt).
Platzhalter

7
@Placeholder Sie sollten das Handbuch lesen, git fetchbevor Sie solchen Unsinn schreiben. Darüber hinaus sollten Sie die ursprüngliche Frage und meine Antwort lesen. Wenn Sie meiner Antwort folgen, werden Sie nicht "zurück in der Geschichte" sein, wie ich den Benutzer ausdrücklich anweise git checkout master. Insgesamt bitte keine Beiträge posten, wenn Sie nicht zu mindestens 50% klar sind, was Sie tun.
Developerbmw

Falls es für andere nicht offensichtlich ist, wird der Ursprunggit fetch origin explizit abgerufen .
Daniel Farrell

2
Dies funktioniert perfekt und ist besser zu erklären als die akzeptierte Antwort.
walen

13

Sie können auch das letzte Commit abrufen und bis zum gewünschten Commit rückgängig machen:

git pull origin master
git reset --hard HEAD~1

Ersetzen Sie masterdurch Ihren gewünschten Zweig.

Verwenden Sie das Git-Protokoll, um zu sehen, auf welches Commit Sie zurücksetzen möchten:

git log

Persönlich hat das bei mir besser funktioniert.

Grundsätzlich wird das letzte Commit abgerufen, und Sie setzen die Commits nacheinander manuell zurück. Verwenden Sie das Git-Protokoll, um den Commit-Verlauf anzuzeigen.

Gute Punkte: Funktioniert wie angegeben. Sie müssen keinen Commit-Hash verwenden oder nicht benötigte Zweige abrufen.

Schlechte Punkte: Sie müssen Commits um eins zurücksetzen.

WARNUNG: Übernehmen / verstauen Sie alle Ihre lokalen Änderungen, da --hardSie diese mit Ihnen verlieren werden. Benutzung auf eigene Gefahr!


3
Ich weiß nicht, warum die Abstimmungen, dies scheint der sauberste Weg zu sein, und sobald Sie auf dem neuesten Stand sein wollen, reicht ein einfacher Zug, im Gegensatz zu einigen anderen Antworten
Mauricio Pasquier Juan

Warum auch nicht mehr Upvotes? Der einzige Nachteil ist, dass Sie vor dem Zurückgehen zum gehen müssen HEAD- und ich weiß nicht, was passieren würde, wenn Sie Konflikte lösen müssten. Diese Lösung ermöglicht jedoch git pull --rebase, und im Gegensatz zu dem, was gesagt wurde, können Sie direkt auf NCommits zurücksetzen, git reset --hard HEAD~Ndh mit (dh für 3 Commits git reset --hard HEAD~3).
Stock Overflaw

2

Wenn Sie ein Commit in Ihrem Zweig zusammenführen, sollten Sie den gesamten Verlauf zwischen abrufen.

Beobachten:

$ git init ./
Initialisiertes leeres Git-Repository in /Users/dfarrell/git/demo/.git/
$ echo 'a'> Brief
$ git Brief hinzufügen
$ git commit -m 'Anfangsbuchstabe'
[master (root-commit) 6e59e76] Anfangsbuchstabe
 1 Datei geändert, 1 Einfügung (+)
 Erstellungsmodus 100644 Brief
$ echo 'b' >> Buchstabe
$ git Brief hinzufügen && git commit -m 'Brief hinzufügen'
[master 7126e6d] Brief hinzufügen
 1 Datei geändert, 1 Einfügung (+)
$ echo 'c' >> letter; git Brief hinzufügen && git commit -m 'Brief hinzufügen'
[master f2458be] Brief hinzufügen
 1 Datei geändert, 1 Einfügung (+)
$ echo 'd' >> letter; git Brief hinzufügen && git commit -m 'Brief hinzufügen'
[master 7f77979] Brief hinzufügen
 1 Datei geändert, 1 Einfügung (+)
$ echo 'e' >> letter; git Brief hinzufügen && git commit -m 'Brief hinzufügen'
[master 790eade] Brief hinzufügen
 1 Datei geändert, 1 Einfügung (+)
$ git log
Commit 790eade367b0d8ab8146596cd717c25fd895302a
Verfasser: Dan Farrell 
Datum: Do 16. Juli 14:21:26 2015 -0500

    Brief hinzufügen

Commit 7f77979efd17f277b4be695c559c1383d2fc2f27
Verfasser: Dan Farrell 
Datum: Do 16. Juli 14:21:24 2015 -0500

    Brief hinzufügen

Commit f2458bea7780bf09fe643095dbae95cf97357ccc
Verfasser: Dan Farrell 
Datum: Do 16. Juli 14:21:19 2015 -0500

    Brief hinzufügen

Commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Verfasser: Dan Farrell 
Datum: Do 16. Juli 14:20:52 2015 -0500

    Brief hinzufügen

Commit 6e59e7650314112fb80097d7d3803c964b3656f0
Verfasser: Dan Farrell 
Datum: Do 16. Juli 14:20:33 2015 -0500

    Anfangsbuchstabe
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Hinweis: Auschecken von '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Sie befinden sich im Status "Freistehender KOPF". Sie können sich umschauen, experimentieren
Änderungen und Festschreiben, und Sie können alle darin vorgenommenen Festschreibungen verwerfen
Status ohne Auswirkungen auf Zweige durch Ausführen einer weiteren Prüfung.

Wenn Sie einen neuen Zweig erstellen möchten, um die von Ihnen erstellten Commits beizubehalten, können Sie dies tun
Tun Sie dies (jetzt oder später), indem Sie -b erneut mit dem Befehl checkout verwenden. Beispiel:

  git checkout -b neuer_zweigname

HEAD ist jetzt bei 7126e6d ... Brief hinzufügen
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Zu einem neuen Zweig 'B' gewechselt
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' scheint kein Git-Repository zu sein
Schwerwiegend: Konnte nicht aus dem Remote-Repository lesen.

Bitte stellen Sie sicher, dass Sie die richtigen Zugriffsrechte haben
und das Repository existiert.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Aktualisieren von 7126e6d..7f77979
Schneller Vorlauf
 Brief | 2 ++
 1 Datei geändert, 2 Einfügungen (+)
$ Katzenbrief
ein
b
c
d

0

Das funktioniert bei mir:

git pull origin <sha>

z.B

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Dies zieht 28eb00, ff39e4 und alles vorher, aber nicht f4d10ad. Es ermöglicht die Verwendung von pull --rebase und berücksichtigt Pull-Einstellungen in Ihrer gitconfig. Dies funktioniert, weil Sie 28eb00 grundsätzlich als Zweig behandeln.

Für die von mir verwendete Version von git erfordert diese Methode einen vollständigen Commit-Hash - es sind keine Abkürzungen oder Aliase zulässig. Sie könnten so etwas tun wie:

[dbn src]$ git pull origin `git rev-parse origin/master^`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.