2016-04-09 21 views
1

Wir versehentlich begangen sha XXXGit: Wirkung von Reset --hard auf zukünftige Verschmelzung

A anstelle von B. verzweigen
A: VVV-WWW-XXX 
B: VVV-WWW 

So werden wir die guidance on SO folgen, um die von A nach B begehen zu bewegen:

git checkout B 
git merge A 
git checkout A 
git reset --hard HEAD~1 
git push --force 

Das wird uns:

A: VVV-WWW 
B: VVV-WWW-XXX 

Wenn wir dann auf Zweig A YYY verpflichten Sie geben uns:

A: VVV-WWW-YYY 
B: VVV-WWW-XXX 

Und fusionieren, dass in B wird, dass sauber YYY in B während nicht Zurücksetzen XXX auf B verschmelzen aufgrund der Tatsache, dass XXX reset --hard vorher für A war? Was wir nach der Zusammenführung wollen würde, ist:

A: VVV-WWW-YYY 
B: VVV-WWW-XXX-YYY 

Ich bin mit dem Affekt der reset --hard auf dem Verschmelzen Verhalten zu kämpfen. Ich denke, dass Reset jede Geschichte des wischt begehen so die Zusammenführung funktionieren würde, nur ohne zu versuchen, XXX von B.

Antwort

4

Das Ergebnis der Zusammenführung wird

   (A) 
VVV --- WWW --- YYY 
      \   \ (B) 
      --- XXX --- ZZZ 

zu entfernen, wo ZZZ merge begehen wird, deren Eltern XXX und YYY. Die einzelnen Buchstaben in Klammern stellen Refs oder Verzweigungsnamen dar, die lediglich Wegweiser in einem Verlaufsgraphen darstellen.

As (für git log --graph --decorate --pretty=oneline --abbrev-commit --all ein handliches Alias) mit git lola gemacht

* 78d2930 (HEAD -> B) ZZZ 
|\ 
| * 549c09e (A) YYY 
* | f585976 XXX 
|/ 
* 537d898 WWW 
* 875611c VVV 

verwendete ich Nachrichten über verpflichten, die Geschichte in Ihrer Frage zu binden. Ihre SHA-1-Objektnamen weichen von den obigen ab.

Nicht überdenken. Denken Sie daran, dass git Snapshots von Baumzuständen speichert und der historische Stammbaum von den Commit-Objekten stammt. Das Verwenden des scharfen Werkzeugs git reset --hard entfernt Geschichte, als ob es nie auftrat, ohne Spuren zurückgelassen zu haben.

Wie jedes scharfe Werkzeug kann git reset --hard Sie schneiden, wenn Sie nicht vorsichtig sind. Denken Sie darüber nach wie rm -rf.

2

reset verschiebt den HEAD/Verzweigungszeiger einfach auf einen anderen Commit. Es hat keine Auswirkungen auf das Repository oder auf zukünftige Operationen.

Sie haben Recht, dass zukünftige Zusammenführungen werden genau gleich funktionieren, unabhängig davon, ob Sie ein Commit Sie die zurückgesetzt oder nicht gemacht haben.