Manchmal könnte ich ein Äquivalent von git stash && git checkout $branch && git stash pop
verwenden, das sich an den Zustand des Baums für einen bestimmten Zweig erinnern und nur den wiederherstellen würde, der für diesen bestimmten Zweig gespeichert wurde. Wie könnte man das leicht erreichen?zwischen Zweigen wechseln, den Stash bewahren?
Antwort
konstruktions git stash
macht eine vorübergehende begehen, die nicht auf ist jede Zweig. Dies ist so, dass Sie es überall sonst anwenden können.
Wenn Sie den Status des Indexes und/oder des Arbeitsbaums speichern und diesen Status mit einem bestimmten Zweig verknüpfen möchten, stellt Git Ihnen das zur Verfügung: git commit
. Wirklich, das ist alles was du brauchst: ein normales altes Commit. Sie können später, wenn Sie zu diesem Zweig zurückkehren, mit dem Befehl "git reset --soft HEAD^
" "entbinden".
Wenn Sie dies in ein Paket einpacken möchten, können Sie eine kurze Commit-Nachricht auswählen, die Sie versprechen, niemals in einem "echten" Commit zu verwenden, und einen kleinen Wrapper für git checkout
schreiben (beachten Sie, dies ist ziemlich ungeprüft) :
#! /bin/sh
# git-swapto: commit any temporary work, swap to another branch;
# automatically de-commits temporary work.
# for git-sh-setup: can work in subdirectory
SUBDIRECTORY_OK=true
. $(git --exec-path)/git-sh-setup
case $# in
1) ;;
*) die "usage: git-swapto <branch>";;
esac
require_work_tree
# From require_clean_work_tree, converted to status;
# assumes work tree exists.
work_tree_is_clean() {
git update-index -q --ignore-submodules --refresh
# if diff-files says different, fail (work tree not clean)
git diff-files --quiet --ignore-submodules || return 1
# if diff-index says index is different, fail (index not clean)
git diff-index --cached --quiet --ignore-submodules HEAD || return 1
# both work tree and index are clean => nothing to commit
return 0
}
# Force branch name as argument, since we want to do a soft
# reset if there is a temporary commit on it. Also, require
# that current HEAD name a branch.
case "$(git rev-parse --symbolic-full-name "$1")" in
refs/heads/*) ;;
*) die "`$1': not a branch name";;
esac
git symbolic-ref -q HEAD >/dev/null || die "not currently on a branch"
temp_commit_string="!! temporary commit, do not push"
# test whether HEAD refers to our temporary commit
current_commit_is_temp() {
local head_text="$(git log --no-walk --pretty=format:%B)"
test "$head_text" = "$temp_commit_string"
}
# Before leaving this branch, make a temporary commit if
# necessary, amending existing temporary commit if there is one.
# (We should never need --amend, this is just paranoia.)
if ! work_tree_is_clean; then
echo "note: leaving temp commit behind" 1>&2
if current_commit_is_temp; then
git commit -a --amend --no-edit ||
die "cannot update current temp commit"
else
git commit -a -m "$temp_commit_string" --no-edit ||
die "cannot make temp commit"
fi
fi
# work tree is now clean, switch to target
git checkout "$1" || die "cannot switch to $1"
# finally, if it is our special temp commit, reset it away
if current_commit_is_temp; then
git reset --soft HEAD^ || die "failed to unmake temp commit"
fi
# all done, for good or ill...
Eigentlich macht es mindestens zwei und manchmal sogar drei, temporäre Commits. Dies ist mehr "Mechanismus" als "Politik", während "nicht auf einem Zweig" Politik/Design ist.
Oder, wie es mit git stash
verwenden zwei Commits, wenn Sie erhalten "index" will und "Work-Baum" getrennt. Ansonsten füge einfach wie gewohnt Dinge zum Index hinzu und mache dann einen einzelnen Commit.
Sie können auch stash-and-checkout
Befehl von git-whistles verwenden. Git-Whistles ist ein Ruby-Juwel. Wenn Sie also Ruby installiert haben, können Sie Git-Whistles mit gem install git-whistles
installieren. Dann können Sie einfach git stash-and-checkout [branch]
tun, um zu erreichen, was Sie tun möchten.
Der Kürze halber habe ich ein Shell-Alias g
für git definiert, und git alias co
für stash-and-checkout
, so auf dem aktuellen Zweig alle nicht gebundenen Arbeit beiseite zu schaffen, wechseln Sie in den neuen Zweig und Pop, Zweig Versteck (falls vorhanden) Ich kann einfach g co [branch]
eingeben. Für Git Alias Setup-Beispiel siehe meine . Gitconfig bei github.com/vwal/my-git-extras.
- 1. Automatisch zwischen SVN-Zweigen desselben Projekts wechseln
- 2. Untracked Dateien zwischen den Zweigen in Git
- 3. Wechseln von Zweigen in Git
- 4. Zwischen den Formularen wechseln
- 5. Zwischen den Layouts wechseln
- 6. Vermeiden Sie Typ Assertions in den Zweigen eines Typs wechseln
- 7. Jquery zwischen den Bildern wechseln
- 8. jQuery - zwischen den Tasten wechseln
- 9. Wechseln zwischen den Registerkarten in NERDTree
- 10. Wechseln zwischen den Fällen mit addOnItemTouchListener
- 11. Wie zwischen den Fragmenten wechseln Tasten
- 12. Datatables Automatisch zwischen den Seiten wechseln
- 13. Finden Sie den Unterschied zwischen 2 entfernten Zweigen
- 14. Wechseln von Zweigen aktualisiert Lösungs-Explorer in Visual Studio
- 15. GIT: Wie ignoriere ich Dateien beim Wechseln von Zweigen?
- 16. Unterschied zwischen zwei Listen zu bewahren Duplikate
- 17. Zwischen Apps wechseln
- 18. Submodul-Konfiguration in Zweigen
- 19. Nicht integrierte Änderungslisten zwischen zwei Zweigen
- 20. Codeigniter zwischen Datenbanken wechseln
- 21. Git unterscheiden Protokolle zwischen zwei Zweigen
- 22. svn: Wie zu automatisieren verpflichten zwischen Zweigen
- 23. zwischen Video-Streaming wechseln
- 24. Wie teile ich Verzeichnisse zwischen Git-Zweigen?
- 25. Git Staging und Commit zwischen mehreren Zweigen
- 26. Wie verschiebt man ein Commit zwischen Zweigen?
- 27. Tipps zum Zusammenführen großer Änderungen zwischen Zweigen
- 28. Wechseln Sie den Zweig, ohne den Arbeitscode zu übergeben
- 29. Wechseln zwischen Registerkartennavigation und Listennavigation
- 30. windows.form C# zwischen Formen wechseln