2009-10-27 16 views
32

In meinen Experimenten jeden funktionellen Unterschied zwischenWas ist der Unterschied zwischen Git zurückgesetzt --hard und git reset --merge

git reset --hard 

und

git reset --merge 

Die Verwendung Ich war nicht in der Lage zu finden Anweisungen geben keinen Hinweis entweder

--hard    reset HEAD, index and working tree 
--merge    reset HEAD, index and working tree 

ich die --hard Option so under regelmäßig nutzen Wie das funktioniert. Was ist der Unterschied zwischen den Optionen --merge und --hard?

Cheers, Olly

Vielleicht ein Beispiel würde hier helfen, lassen Sie uns die folgende Sequenz verwenden:

cd git_repo 
touch file_one 
git add file_one 
git commit -m "commit one" # sha1 of 123abc 
echo "one" >> ./file_one 
git commit -a -m "commit two" # sha1 of 234bcd 
echo "two" >> ./file_one 
git add . # populate index with a change 
echo "three" >> ./file_one # populate working area with a change 

Nun, wenn ich

git reset --merge 123abc 

versuche ich bekommen

error: Entry 'file_one' not uptodate. Cannot merge. 
fatal: Could not reset index file to revision '123abc' 

der Grund, dass file_one zu sein hat Änderungen sowohl in den Arbeitsbereich und dem Index

Um dies zu beheben, ich

git add . 
git reset --merge 123abc 

Diesmal ist es funktioniert, aber ich das gleiche Ergebnis wie git reset --hard erhalten. Der Index ist leer, der Arbeitsbereich ist leer, file_one ist leer, wie nach dem ersten Commit.

Kann jemand mit den Schritten kommen, die den Unterschied veranschaulichen?

Antwort

26

Von git reset manpage:

 
--hard Matches the working tree and index to that of the tree being 
       switched to. Any changes to tracked files in the working tree since 
       <commit> are lost. 

--merge 
       Resets the index to match the tree recorded by the named commit, and 
       updates the files that are different between the named commit and 
       the current commit in the working tree. 

Die git reset --merge soll eine sicherere Version von git reset --hard sein, wenn Sie Ihre Änderungen und jemand anderem Änderungen zusammengemischt werden, versuchen, unsere Änderungen zu tragen.

+1

Ich habe diese Dokumente gelesen, aber muss sagen, dass ich nicht viel Sinn von ihnen machen kann. "Setzt den Index so zurück, dass er mit dem vom benannten Commit aufgezeichneten Baum übereinstimmt" Meines Wissens ist der Index nach dem Reset --merge-Vorgang leer, dieser Kommentar scheint etwas anderes anzuzeigen. "und aktualisiert die Dateien, die sich im benannten Commit und dem aktuellen Commit im Arbeitsbaum unterscheiden" Wo werden die Aktualisierungen an diesen Dateien vorgenommen, sie erscheinen nicht im Index, werden sie automatisch übernommen? – opsb

+1

Nach 'git reset --merge ' haben Sie index == , aber es aktualisiert nur die Dateien in der Arbeit sind, die sich zwischen HEAD (current commit) und (named commit) unterscheiden und einige Ihrer lokalen Änderungen beibehalten . –

+0

In dem obigen Beispiel habe ich festgestellt, dass ich keine Git reset --merge durchführen konnte, wenn ich Änderungen im Arbeitsbereich hatte. Ist das tatsächlich möglich, indem ich andere Schritte als die oben gezeigten verwende? – opsb

3

Offenbar nach:

http://www.kernel.org/pub/software/scm/git/docs/git-reset.html

--hard - Übereinstimmung mit dem Arbeits Baum und Index, dass der Baum umgeschaltet wird zu. Alle Änderungen an verfolgten Dateien im Arbeitsbaum seit <commit> sind verloren.

--merge - Setzt den Index der Baum durch die benannte begehen, und aktualisiert die Dateien, die unterscheiden sich zwischen den genannten begehen und die aktuelle begehen im Arbeitsbaum aufgezeichnet übereinstimmen.

7

Dies ist hilfreich, wenn Sie einen Pull mit Änderungen im Arbeitsbaum ausführen und feststellen, dass die Zusammenführung nicht wie erwartet verläuft (Sie haben möglicherweise erwartet, dass die Commits die Dateien nicht beeinträchtigen, an denen Sie gerade gearbeitet haben). An diesem Punkt, wenn Sie git reset --hard ORIG_HEAD tun, blasen Sie alles weg, einschließlich Ihrer lokalen Änderungen. Wenn Sie git reset --merge ORIG_HEAD tun, behalten Sie Ihre lokalen Änderungen bei.

8

Der Artikel „Git undo, reset or revert?“ fasst die verschiedenen Verwendungen, wenn sie mit ORIG_HEAD verwendet:

# Reset the latest successful pull or merge 
$ git reset --hard ORIG_HEAD 

# Reset the latest pull or merge, into a dirty working tree 
$ git reset --merge ORIG_HEAD 

Wie answer von manojlds ‚s erwähnt und dargestellt durch die blog post, letzteres ist besonders nützlich, wenn Sie einen Fehler sehen Meldung wie:

fatal: You have not concluded your merge. (`MERGE_HEAD` exists) 

Der Thread "[PATCH] refuse to merge during a merge" beschreibt auch diesen Punkt:

git reset --merge HEAD 

Es füllt den etwas anderen Fall, in dem Sie eine saubere Zusammenführung mit einigen uncommitted Veränderungen in der worktree taten, will aber dann wieder die Zusammenführung verwerfen, ohne die unbestätigten Änderungen zu verlieren.
In Abwesenheit der Änderungen würden Sie einfach --hard verwenden, aber hier möchten Sie die Zweigspitze verschieben, während Sie sie zusammenführen, ähnlich wie 'git checkout -m' für , das HEAD verschiebt.

Verwandte Themen