web-dev-qa-db-fra.com

Basculer vers une autre branche sans modifier les fichiers de l'espace de travail

J'ai cloné un dépôt git à partir de GitHub, apporté des modifications et des commits; J'ai fait pas mal de choses et elles sont toutes assez sales, elles ne peuvent donc pas être tirées. Maintenant, j'ai créé la branche cleanchanges à partir de Origin/master, elle est donc propre et je veux valider mes modifications sous la forme d'une validation avec un commentaire de validation Nice.

Lorsque je suis sur le maître local, je souhaite passer à ma cleanchanges mais sans modifier les fichiers. Et puis je suis capable de commettre.

Comment changer de branche sans changer de fichier?

Je tiens à préciser: tous les changements ont été validés dans la variable locale master. Il n'y a pas de modifications non validées.

55
amorfis

Edit: Je viens de remarquer que vous avez dit que vous aviez déjà créé des commits. Dans ce cas, utilisez git merge --squash pour effectuer un seul commit:

git checkout cleanchanges
git merge --squash master
git commit -m "Nice commit comment for all my changes"

( Edit: La réponse suivante s’applique si vous avez uncommitted modifications.)

Il suffit de changer de branche avec git checkout cleanchanges. Si les branches font référence à la même référence, toutes vos modifications non validées seront conservées dans votre répertoire de travail lorsque vous basculerez.

Un conflit ne survient que si un fichier du référentiel est différent de Origin/master et cleanchanges. Si vous venez de créer la branche, alors pas de problème.

Comme toujours, si vous êtes préoccupé par la perte de travail, faites d'abord une copie de sauvegarde. Git est conçu pour ne pas jeter le travail sans vous le demander au préalable.

52
Greg Hewgill

Git. Basculer vers une autre branche

git checkout branch_name
35
Surendra Kumar Ahir

La meilleure solution consiste à stash les modifications et à changer de branche. Pour changer de branche, vous avez besoin d'un état propre. Alors rangez-les, vérifiez une nouvelle branche et appliquez les modifications sur la nouvelle branche et validez-la.

7
vivek85

Une autre façon, si vous voulez créer un nouveau commit au lieu d’effectuer une fusion:

git checkout cleanchanges
git reset --hard master
git reset cleanchanges

git status
git add .
git commit

La première réinitialisation (matérielle) définira votre arbre de travail sur la même chose que le dernier commit dans master.

La deuxième réinitialisation remettra votre HEAD à son emplacement actuel, en indiquant le bout de la branche cleanchanges, mais sans modifier aucun fichier. Alors maintenant, vous pouvez les ajouter et les valider.


Par la suite, si vous souhaitez supprimer les commits sales que vous avez effectués de master (et en supposant que vous ne les ayez pas encore envoyés), vous pouvez:

git checkout master
git reset --hard Origin/master

Cela annulera tous vos nouveaux commits, ramenant votre branche master locale au même commit que celui du référentiel.

1
joeytwiddle

On dirait que vous avez apporté des modifications en les engageant à maîtriser en cours de route et que vous souhaitez maintenant les combiner en un seul commit.

Si c'est le cas, vous voulez rebassez vos commits en les écrasant dans un seul commit. 

Je ne suis pas tout à fait sûr de ce que vous voulez exactement, alors je ne vais pas vous tenter avec un script. Mais je vous suggère de lire git rebase et les options pour "écraser", et d'essayer quelques trucs.

1
timdev

Pourquoi ne pas simplement git reset --soft <branch_name>?

Manifestation:

mkdir myrepo; cd myrepo; git init
touch poem; git add poem; git commit -m 'add poem'  # first commit
git branch original
echo bananas > poem; git commit -am 'change poem'  # second commit
echo are tasty >> poem  # unstaged change
git reset --soft original

Résultat:

$ git diff --cached
diff --git a/poem b/poem
index e69de29..9baf85e 100644
--- a/poem
+++ b/poem
@@ -0,0 +1 @@
+bananas
$ git diff
diff --git a/poem b/poem
index 9baf85e..ac01489 100644
--- a/poem
+++ b/poem
@@ -1 +1,2 @@
 bananas
+are tasty

Une chose à noter cependant, est que la branche actuelle change à original. Vous êtes toujours dans la branche précédente après le processus, mais vous pouvez facilement git checkout original, car il s'agit du même état. Si vous ne voulez pas perdre la HEAD précédente, notez la référence de validation et faites git branch -f <previous_branch> <commit> après cela.

0
Yushin Washio

La façon la plus simple de faire est la suivante:

git fetch && git checkout <branch_name>
0
Mandeep Singh