100 votes

git create commit à partir de la différence entre deux branches

J'ai deux branches qui ont très peu d'histoire similaire, mais qui sont liées l'une à l'autre.

Je veux les changements entre ces deux-là dans un git commit.

les fichiers ont été supprimés et créés entre ces patchs et je veux que le patch reflète cela.

c'est-à-dire que les éléments suivants ne fonctionneront pas :

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

144voto

Balog Pal Points 6584

Une façon simple de transformer "le diff de branch_b..branch_a" en un commit est :

  1. créer et contrôler la branche tmp à branch_a ( git branch tmp branch_a && git checkout tmp ) (ou git reset --hard branch_a sur une branche existante)
  2. git reset --soft branch_b
  3. git commit

ce commit inclura toutes les différences entre branch_b et branch_a.


Cela fonctionne parce que

  • 1. fait en sorte que les fichiers reflètent la branche_a. C'est le "résultat final" que vous voulez pour la branche
  • 2. "réinitialise la tête de la branche_b" mais "laisse tous vos fichiers modifiés [c'est-à-dire la tête de la branche_a] comme "Changements à livrer", comme git status le dirait." ( git reset --soft docs (en ajoutant les branches de cet exemple)

40voto

Cory Klein Points 5117

Si vous avez deux branches :

  1. has-changes
  2. needs-changes

Et vous voulez déplacer les changements de has-changes sur needs-changes alors faites ce qui suit :

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

12voto

AndrewSk Points 121

Tout se résume à un git reset --soft branch_b au-dessus d'une branche temporaire basée sur la branche_a, et le résultat est renvoyé à la branche_b.

Il s'agit d'une marche à suivre, étape par étape, à travers le processus :

#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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X