Git commit non terminé mais ne peut pas continuer sur cette machine


11

Parfois, je rencontre le problème d'avoir du code non engagé sur un poste de travail qui n'est pas prêt pour une validation mais doit être complété sur un autre poste de travail ou ordinateur portable.

Quelqu'un at-il une solution à ce problème, comme un «soft commit» ou une autre façon de transférer les modifications sur une autre machine pour les travailler ailleurs?

Je préférerais ne pas être obligé de valider et de pousser des changements qui ne sont pas correctement mis en œuvre.


2
ce post est assez difficile à lire (mur de texte). Cela vous dérangerait de le modifier sous une meilleure forme?
gnat

..des sons comme si tu étais git stash...?
Simon Whitehead

@SimonWhitehead oui mais puis-je facilement déplacer une cachette git sur une autre machine?
csteifel

Tous les commits Git sont des "soft commits".
user253751

Réponses:


12

Ce qui suit suppose que votre dépôt local est un clone d'un dépôt sur un autre serveur, par exemple github; et que vous avez le droit d'apporter des modifications au serveur en amont. Dans mon exemple, j'ai appelé ce dépôt en amont «origine». Exécutez git remote showpour répertorier les autres référentiels, cela peut vous donner un indice sur son nom.

Je suggérerais de créer une branche, alors vous pouvez vérifier la branche sur une autre machine. En fait, si vous créez une branche dès que vous commencez à travailler, vous pouvez "valider" votre branche, avoir une trace et une sauvegarde de votre travail, sans avoir à avoir un jeu de codes stable. Une fois que vous êtes satisfait de votre travail, vous pouvez le fusionner à nouveau dans votre branche "maître".

  • Pour brancher votre référentiel: git checkout -b MyNewBranch
  • Pour pousser les changements engagés de votre nouvelle branche: git push origin MyNewBranch
  • Pour vérifier une branche sur une autre machine: git checkout MyNewBranch
  • Pour passer à une autre branche (par exemple "maître"): git checkout master
  • Une fois en master, pour fusionner MyNewBranch dans: git merge MyNewBranch
  • Pour répertorier les branches: git branch

3
Oui, toujours travailler dans votre propre branche privée résout essentiellement ce problème. Vous pouvez vous engager aussi souvent que vous le souhaitez sans affecter personne d'autre. Encore mieux est de créer une nouvelle branche chaque fois que vous commencez à travailler sur une nouvelle fonctionnalité ou commencez à corriger un nouveau défaut. Cela rend très facile de faire des allers-retours entre les bases de code.
Gort le robot

De plus, et la raison pour laquelle je fais cela: si vous faites une erreur à mi-chemin, vous pouvez passer aux validations précédentes sur la branche actuelle. Ou, sautez en arrière, attrapez-en un morceau, sautez en avant et appliquez.
AMADANON Inc.

1
Cette méthode n'inclurait-elle pas également les validations incomplètes dans la branche principale fusionnée?
eimrek

Oui, et (à mon avis) ce n'est probablement pas une mauvaise chose. Si vous ne le souhaitez pas, faites ce qui précède, puis au lieu de valider votre code, créez un diff (qui inclut toutes les modifications de fichier, mais pas de validations), appliquez-le à une nouvelle copie de la branche, puis appuyez dessus.
AMADANON Inc.

2
concernant " Pour passer à une autre branchegit branch -d master ", je suis confus, cela ne demande-t-il pas à git de supprimer la branche master ?? (c'est l'impression que j'ai quand même de lire le manuel de la branche git)
Tasos Papastylianou

2

Vous pouvez utiliser git diffpour créer un patch puis l'appliquer sur une autre machine. Ou vous pouvez créer un commit temporaire, puis le retirer d'une autre machine. Vous pouvez même créer une branche temporaire sur une autre machine, y pousser votre commit temporaire, puis supprimer la branche.

Ma méthode préférée est la deuxième: créer un commit temporaire, puis aller sur une autre machine et faire quelque chose comme ceci:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

Pourquoi si compliqué et pas seulement utilisé git format-patch?
try-catch-finally

Pas vraiment différent de git diff. Y a-t-il quelque chose qui me manque?
aragaer

1
git format-patch deadbee..badcab1e- Il crée des .patchfichiers pour chaque commit séparément avec un joli nom et un message de commit préservé.
try-catch-finally

Cela crée-t-il également un correctif pour les modifications qui ne sont pas encore validées? Est-ce qu'il sépare l'index actuel et les choses qui ne sont pas encore mises en scène? On dirait que non.
aragaer

Non, pas pour les modifications non validées / non programmées. Mais comme un commit ne fait de mal à personne d'autre tant que vous ne poussez pas, il devrait être OK de valider (avec un message clair qui dit "WIP" - travail en cours).
try-catch-finally

2

Je le commets . Le je le pousse à la branche personnelle , vérifiez de l'autre côté et modifiez. Et supprimez la branche personnelle lorsque vous avez terminé.

Bien sûr, vous pouvez pousser directement entre les dépôts, vous pouvez utiliser le bundle ou format-patch/ am, mais une branche personnelle est de loin la solution la plus simple. Et réécrire l'histoire n'est pas un gros problème tant qu'il n'est poussé vers aucune branche partagée. Dans de nombreux projets, les gens sont censés rembobiner les branches de fonctionnalités pour les rendre plus faciles à comprendre pour la révision.


0

L'approche facile est celle que vous décrivez: copiez le .gitrépertoire caché et les fichiers de projet sur une autre machine où vous pouvez soit valider et terminer, soit simplement continuer à travailler.

Le .gitrépertoire est l'endroit où votre historique git est conservé, donc le conserver avec les fichiers réels conserve l'intégralité de l'historique de votre projet.

Si vous avez définitivement terminé d'utiliser la machine d'origine, je recommanderais probablement cette approche.


0

Comme d'autres l'ont répondu, avec Git, vous ne devriez pas vous soucier du code non fini dans vos branches personnelles. Cependant, si pour une raison quelconque, vous ne voulez vraiment vraiment pas que votre travail inachevé touche le référentiel principal, vous pouvez utiliser la nature distribuée de Git!

Il existe un outil simple nommé git bundlequi peut vous aider à transmettre facilement les modifications sans référentiel central. Tout d'abord, clonez le dépôt:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

apporter des modifications et les valider dans une branche temporaire:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

Maintenant, regroupez les modifications:

git bundle create ../tmp.bundle tmp_branch

Vous avez maintenant un fichier groupé que vous pouvez envoyer à votre nouvelle machine. Comment l'utilisez-vous là-bas? Créons une nouvelle copie de travail:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

nous devons traiter notre bundle comme une autre télécommande, afin que nous puissions récupérer les modifications

git remote add tmp ../tmp.bundle
git fetch tmp

puisque le but était de transférer les modifications sans laisser de trace, nous voulons les écraser dans la copie de travail afin de perdre la validation temporaire:

git merge tmp/tmp_branch --squash

et tout ce qui reste est de supprimer la télécommande temporaire:

git remote remove tmp

ALTO! Les modifications ont été transférées dans la nouvelle copie de travail sans laisser de trace ni de branche ni de commit!

Mais vraiment - ce processus est assez long et lourd. C'est Git, pas SVN - il ne devrait vraiment pas y avoir de raison de ne pas pousser votre branche personnelle vers le référentiel central.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.