git create commit from diff zwischen zwei Zweigen

73

Ich habe zwei Zweige, die sehr wenig ähnliche Geschichte haben, aber miteinander verwandt sind.

Ich möchte die Änderungen zwischen diesen beiden in einem Git Commit.

Dateien wurden zwischen diesen Patches gelöscht und erstellt, und ich möchte, dass der Patch dies widerspiegelt

dh: das folgende Zeug wird nicht funktionieren:

git diff branch_a branch_b -- > patchfile
git checkout branch_b
git apply patchfile # deletes and adds are ignored
git commit # we miss the deletes
Alexander Oh
quelle

Antworten:

118

Ein einfacher Weg, dies zu tun, ist:

  • Erstelle und checke branch tmp bei branch_a ( git branch tmp branch_a && git checkout tmp)
  • git reset --soft branch_b
  • git commit

Dieses Commit muss alle Unterschiede haben

Balog Pal
quelle
1
Sie brauchen kein gemeinsames Commit oder Berühren der Zweige vorne. Versuchen Sie es einfach in gitk - während Sie an einem neuen Zweig experimentieren, der sowieso weg sein wird, haben Sie einen freien Lauf.
Balog Pal
Arbeitete für mich mit Git 1.7.9.5
Wischan
10
genauer: git branch tmp branchA && git checkout tmp && git reset --soft branchB && git checkout branchB && git branch -D tmp && git commit
bernstein
Zweig b Name hat einen Tippfehler, sollte seinto_branch_b
Hywak
das ist git reset --soft <branch_b>,git commit
Harry Moreno
24

Wenn Sie zwei Zweige haben:

  1. has-changes
  2. needs-changes

Und Sie möchten die Änderungen von has-changesauf verschieben needs-changesund dann Folgendes tun:

git checkout -b deleteme has-changes # Create temporary branch to build commit on
git reset --soft needs-changes       # Move diff into index
git commit                           # Create the diff patch commit
git checkout needs-changes           # Switch to branch that needs changes
git cherry-pick deleteme             # Apply the diff to the needs-changes
git branch -D deleteme               # Delete the temporary branch
Cory Klein
quelle
8

Es kommt alles auf einen git reset --soft branch_btemporären Zweig an, der auf branch_a basiert, und das Ergebnis wird an branch_b zurückgegeben.

Dies ist eine Schritt-für-Schritt-Anleitung:

#Start out on the branch with the code we want
git checkout branch_a

#create tmp branch same as branch_a (so that we don't change our local branch_a state during the operation)
git branch tmp

#working directory has all the code that we want, on tmp branch
git checkout tmp

# Change the branch head to the branch we want to be on. All the delta
# between the current source code and branch_b is now staged for commit
git reset --soft branch_b

# Move away from tmp, so our commit will go directly to branch_b
git checkout branch_b

# Now you can examine the proposed commit
git status

# Add the delta we want to the branch
git commit

# Sanity check that the branches have the same content now (should return an empty line)
git diff branch_A..branch_b

# Remove tmp, we don't need it anymore
git branch -D tmp
AndrewSk
quelle