Git Merge ohne Auto Commit


402

Ist es möglich, ein git merge, aber ohne Commit zu machen?

"man git merge" sagt dies:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

Aber wenn ich versuche, git mergemit dem zu arbeiten, wird --no-commites immer noch automatisch festgeschrieben. Folgendes habe ich getan:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Im Folgenden werden git logalle Commits aus dem Zweig v1.0 angezeigt, die in master zusammengeführt wurden.

Antworten:


616

Notieren Sie die Ausgabe beim Zusammenführen - heißt es Fast Forward

In solchen Situationen möchten Sie Folgendes tun:

git merge v1.0 --no-commit --no-ff

7
Was ist, wenn es einen Konflikt gibt?
Jürgen Paul

20
@PineappleUndertheSea Schneller Vorlauf verursacht niemals Konflikte. Im Falle einer "echten" Zusammenführung ohne schnellen Vorlauf ist der --no-commitSwitch nur dann wirksam, wenn kein Konflikt auftritt. Im Falle eines Konflikts wird git niemals automatisch festgeschrieben.
Gronostaj

38
Zu Ihrer Information: Wenn Sie die Änderungen zusammenführen und dann festschreiben möchten, als hätten Sie alle Änderungen, die Sie zusammengeführt haben, manuell eingegeben (im Gegensatz zu einer herkömmlichen Zusammenführung), müssen Sie sie anschließend ausführen rm .git/MERGE_HEAD, wodurch git gezwungen wird, zu vergessen, dass die Zusammenführung stattgefunden hat.
Jonn

7
Zu Automatic merge went well; stopped before committing as requested
Ihrer Information

6
Anscheinend habe git merge BRANCHENAME --no-commit --no-ffich meinen Arbeitsbereich in einem "MERGING" -Zustand verlassen. Nicht ganz sicher , was das genau das tut, aber eine einfache git stash saveund git stash popZyklus schien alles wieder zu normalisieren; mit nur den geänderten Dateien aus dem Zielzweig wie beabsichtigt und nicht mehr mit dem Status MERGING.
MoonLite

49

Sie verstehen die Bedeutung der Zusammenführung hier falsch.

Die --no-commitverhindert , dass die MERGE COMMIT auftritt, und das geschieht nur , wenn Sie zwei divergierende Zweig Geschichten verschmelzen; In Ihrem Beispiel ist dies nicht der Fall, da Git angibt, dass es sich um eine "Schnellvorlauf" -Zusammenführung handelt, und Git dann nur die bereits in der Verzweigung vorhandenen Commits nacheinander anwendet.


12
Das würde (imo) nicht unbedingt die Verwirrung beseitigen; Ich denke, dies ist ein (relativ seltenes) Mal, dass die Dokumente tatsächlich klar sind: git help merge=> " --no-commitWenn Sie die Zusammenführung durchführen, aber so tun, als wäre die Zusammenführung fehlgeschlagen, und keine automatische Festschreibung vornehmen, um dem Benutzer die Möglichkeit zu geben, das Zusammenführungsergebnis vor dem Festschreiben zu überprüfen und weiter zu optimieren. "" Der Schlüssel ist natürlich, es in Verbindung mit--no-ff
Michael

6
... vielleicht wäre es weniger verwirrend, von der strengen Terminologie abzuweichen und sie folgendermaßen zu beschreiben: Eine "Git-Zusammenführung", die einen schnellen Vorlauf ausführt, hat kein Zusammenführungs-Commit, da es überhaupt keine Zusammenführung gibt. Dies ist in der Tat die ideale Situation: Schneller Vorlauf ist eine gute Sache, und es macht Sinn, dieses zusätzliche "Merge Commit" nicht zu haben. Dies ist ein gutes Standardverhalten und sollte nicht deaktiviert werden. (Im richtigen Sprachgebrauch ist ein schneller Vorlauf eine Art Zusammenführung, aber keine "echte Zusammenführung".)
Michael

4
Es ist relativ zu den Richtlinien des Projekts. In einigen Fällen ist es nützlich, diese zusätzlichen "Zusammenführungs-Commits" zu haben / zu erzwingen, selbst wenn es sich um ein ff handelt, da Sie die Aufnahme des Features in den Hauptzweig markieren müssen.
Samus_

7
...Was. In Ordnung, ich denke, Git ist so ziemlich unrettbar. Insbesondere diese Antwort hat mich überzeugt, Mercurial auszuprobieren.
Brian Gordon

24

Wenn Sie nur alle Änderungen in einem Commit festschreiben möchten, als hätten Sie sich selbst eingegeben, reicht --squash ebenfalls aus

$ git merge --squash v1.0
$ git commit

1
Ist dies der gleiche Effekt wiegit merge v1.0 --no-commit --no-ff
jpierson

2
Nein, anderer Effekt. Squash erstellt ein neues Commit mit einem neuen Hash. Es kombiniert alle Commits in einem Zweig zu einem Commit für die Zusammenführung.
Kavi Siegel

23

Ich bevorzuge diesen Weg, damit ich mich an keine seltenen Parameter erinnern muss.

git merge branch_name

Es wird dann angezeigt, dass Ihre Niederlassung durch " #" Commits voraus ist. Sie können diese Commits jetzt entfernen und sie wie folgt in die Arbeitsänderungen einfügen:

git reset @~#

Wenn zum Beispiel nach dem Zusammenführen 1 Commit voraus ist, verwenden Sie:

git reset @~1

Hinweis: Unter Windows sind Anführungszeichen erforderlich. (Wie Josh in den Kommentaren bemerkt hat) zB:

git reset "@~1"

4
Unter Windows werden Anführungszeichen benötigt:git reset "@~1"
Josh

1

Wenn es nur in der Filiale ein Commit gibt, mache ich das normalerweise

git merge branch_name --ff
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.