2012-08-08 5 views
9

Ich habe Zweig foo von Master/Kopf. Ich wollte den Master/Kopf verbessern und diese Änderungen auf dem Zweig foo abholen lassen. Ich habe folgendes:Wie git commit - ein commit, das die Basis eines Zweiges ist,

git checkout master 
git add ... 
git commit --amend 
git checkout foo 
git rebase master 

Das Problem war die alte, nicht geändert begehen als Teil des Zweiges foo zeigt sich nach der Änderung, und es wurde auf Master umbasiert. Ich habe eine Git-Rebase -i und löschte die alte Commit und das hat funktioniert, aber gibt es eine einfachere/sicherere Möglichkeit, das Commit zu ändern, das die Basis eines Zweiges ist? Und ja, es ist alle lokalen Commits, die nicht gedrückt haben ..

Antwort

11

Alles, was Sie tun musste, war git zu sagen, wo aus den Fütterungsmaterial zu starten: Sie können tun, um diese

git rebase --onto master SOMESHA foo 

Wo SOMESHA das ist alter Meister SHA. Das heißt, wenn Ihr Baum sieht nun wie folgt

* aaaaaa - (master) 
| * bbbbbb - (foo) 
| * cccccc - (old master) 
|/ 
* ffffff 

Und Sie tun

git rebase --onto master cccccc foo 

Ihr Baum wird dann wie folgt aussehen.

* dddddd - (foo) 
| 
* aaaaaa - (master) 
| 
* ffffff 

ASIDE: wir verschiedene Namen für die cccccc begehen, wenn Sie nicht wie mit SHA-Werte verwenden können.

> git reflog master 

aaaaaa [email protected]{0}: reset: moving to something 
cccccc [email protected]{1}: commit: change the froozle 
ffffff [email protected]{2}: commit: snarf the froozle 

Das heißt, wir cccccc als [email protected]{1} (AKA, die vorherige Position von Master) verweisen können

So konnten wir dies als

git rebase --onto master [email protected]{1} foo 

Eine weitere Beschreibung der foo^cccccc ist begehen schreiben rebase (AKA, die parernt für foo commit), so dass wir dies auch als

git rebase --onto master foo^ foo 
012 schreiben könnten

Sie alle machen genau dasselbe, und Sie können es vorziehen, verschiedene in verschiedenen Situationen zu verwenden. Normalerweise finde ich den SHA einfach zu benutzen, da ich oft einen Graphen meines Repositorys aufreiße, bevor ich diese Art von Operation durchführe.

+0

Danke, das funktioniert – Aaron

+0

Anstelle des Commits SHA können Sie auch 'master @ {1}' verwenden. – chbaker0

+0

@ chbaker0 Sie sind absolut richtig - ich dachte zuerst, Sie würden etwas anderes vorschlagen. Ich füge diesen Vorschlag der Antwort mit einer Erklärung hinzu. –