2016-05-05 7 views
0

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

0

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.

1

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.

Verwandte Themen