2013-07-03 12 views
5

Nehmen wir an, ich arbeite an einer Funktion in einem Zweig namens foo_baz.Squash commit auf Master aber separate Commits auf Feature-Zweig?

Ich Commit mehrere Male, wie ich an der Funktion arbeiten.

Ich pushe regelmäßig foo_baz, eine Remote-Tracking-Zweig, zu einem Remote-Repo. IE origin/foo_baz.

Ich gehe zu dem Punkt, wo ich alle commits von foo_baz in master zusammenführen und an origin/master drücken möchte. Hier ist die Frage:

Kann ich fusionieren foo_baz in master, so dass alle Commits noch in foo_baz trennen ‚s histroy, aber das in master‘ s Geschichte, sie sind alle eins, zerquetscht zu begehen?

Edit:

Ich bin ein bisschen ein git Anfänger, also bitte verzeiht mir, wenn es etwas völlig klar, dass ich fehle. Ich habe im Internet geforscht, konnte aber keine direkte Antwort auf meine Frage finden.

Antwort

5

Sie könnten tatsächlich nach --squash suchen (wie in den anderen Antworten), aber Sie könnten stattdessen nach --no-ff suchen.

Hier ist der Unterschied zwischen den beiden. Angenommen, Sie mit zwei Commits beginnen:

A --- B    <-- branch "master", when you start 

und dann machen zwei weitere auf dem neuen Zweig foo_baz:

A --- B    <-- master 
     \ 
      C --- D  <-- foo_baz 

Now (einmal zurück auf master), haben Sie diese beiden Optionen (unter anderem).

A --- B ----------- E <-- master 
     \ 
      C --- D  <-- foo_baz 

oder Sie können git merge --no-ff: Sie können git merge --squash foo_baz && git commit, die Sie die folgenden geben

A --- B ----------- E <-- "master" after merge --no-ff 
     \  /
      C --- D  <-- foo_baz 

Beide Sie geben einen neuen begehen E -im ersten Fall aus dem separaten git commit Befehls aber die Der erste unterdrückt die Aktion "Mehrere Eltern", sodass Sie am Ende, wenn Sie in einem Jahr darauf zurückblicken, so aussehen, als hätten Sie alle Änderungen aus dem Zweig kopiert. Die Baum (alle Dateien, die Sie erhalten, wenn Sie git checkout die Filialen) wird in und E die gleiche sein (in diesem speziellen Fall sowieso, wo es keine Änderungen an B auf master vor der Zusammenführung Aktion), aber sie ' Wieder andere Commits.

Der Unterschied von einer geraden git merge ist, dass letztere wird in der Regel ein „schneller Vorlauf“ herzustellen, die wie folgt aussieht:

A --- B 
     \ 
      C --- D  <-- foo_baz, master 

, wo die gewinkelten Linie aus begradigt werden kann, können Sie eine Geschichte geben, wo beide Zweige sehen genau gleich aus.

0

denke ich, was Sie wollen so etwas wie dieses:

git merge --squash foo_baz 
git commit 
0

Ich glaube, du bist für die --squash Flagge suchen.

Verwandte Themen