我需要一种方法将一个暂存的更改导出到另一台计算机。
在第一台计算机上,我执行了以下操作:
$ git stash save feature
我正在尝试将stash的补丁保存到文件中,然后将其导入另一台计算机
$ git stash show -p > patch
这个命令会生成一个文件,我可以将它移动到另一台已经克隆了该存储库的计算机上,但问题是如何再次将其作为stash导入。
我需要一种方法将一个暂存的更改导出到另一台计算机。
在第一台计算机上,我执行了以下操作:
$ git stash save feature
我正在尝试将stash的补丁保存到文件中,然后将其导入另一台计算机
$ git stash show -p > patch
这个命令会生成一个文件,我可以将它移动到另一台已经克隆了该存储库的计算机上,但问题是如何再次将其作为stash导入。
你可以通过运行以下命令来应用补丁文件(尚未提交更改):
git apply patchfile
那么,您可以直接从当前工作目录创建一个新的stash:
git stash
git stash show "stash@{0}" -p > patch
,而不是 OP 的第二个 shell 命令。 - Tim Arnoldstash@{0}
周围加上双引号。 - ari goldgit apply --reject --whitespace=fix mychanges.patch
。注意不要更改原意,并尽可能使翻译通俗易懂。 - rishiehari$ git stash show "stash@{0}" -p > changes.patch
“stash@{0}”是藏匿的引用。它将使用最新的stash创建补丁文件。
如果您想要不同的,请使用命令$ git stash list
查看您的stash列表并选择要打补丁的内容。
应用补丁
现在将stash转移到另一台机器并将其粘贴到项目的根文件夹中。 然后运行此命令。
$ git apply changes.patch
如果有错误并且您想撤销更改
$ git apply changes.patch --reverse
git apply changes.patch
还是 git stash apply changes.patch
?前者可行,后者会给我报错(无论是否使用 <
将文件作为输入读取)。 - yuyu5git apply --3way changes.patch
命令来尝试解决冲突,如果你遇到了 "patch does not apply" 的错误。更多信息请参考:https://dev59.com/3G445IYBdhLWcg3wnrrM#47756467 - epineda另外,您可以按照以下步骤将整个本地存储(包括其他本地分支、本地标签等)复制到另一台计算机:
git pull
以确保两者都具有最新更改(或使用git reset --hard commit-hash
确保两个仓库具有相同的HEAD
)。你可以从你的暂存区(在电脑1上)创建一个分支,使用以下命令:
alternatively you can create a branch from your stash (on computer 1), using
git stash branch stashed_changes_branch
提交您的更改:
git commit -a
然后在第二台电脑上将其添加为远程:
git remote add pc1 user@computer1:/path/to/repo
现在您可以使用以下方法检索远程信息
git fetch pc1
现在你可以按你想要的方式导入提交;使用git cherry-pick、git rebase或者任何你喜欢的方式...
如果你想让它看起来像刚刚使用了git stash apply一样;你可以使用git cherry-pick --no-commit.
如果在计算机1和计算机2之间没有直接连接;你可以使用远程库(比如github或类似的东西):
git push origin stashed_changes_branch
并且在computer2上:
git fetch
git stash list --oneline
),因此您在技术上不必将stash应用于新的提交对象。换句话说,创建一个新分支并不是必要的。但是,直接将stash推送到远程可能会很棘手。 - Tyler Crompton一个stash是介于基础提交和索引之间的工作目录的特殊合并提交。一种方法是将每个存储为单独的补丁,首先检出stash的第一个父级,从这两个补丁还原索引和工作目录,最后还原stash(似乎有一个答案是这样做的)。
这是为了完全重新创建所有stashes的信息,如果您不关心它,您至少应该在还原之前检出stash的第一个父级以避免冲突并跟踪stash的创建位置。
这就是我用来完全恢复一个repo中所有stash的方法。如果您不能将它们保存在同一台计算机上,可以在创建它们之后将stash标记保存在bundle中,并将ref列表和bundle复制到目标计算机。
从原始repo的根目录开始:
stash_
+逻辑stash ref中的数字)refs=$(git stash list|cut -d: -f1)
for ref in $refs; do git tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD
注意:这需要bash或兼容的shell(ksh、zsh应该都可以...)。如果你的shell不支持${param//pattern}
,你还可以递增一个变量,例如stash_$((i++))
。
现在,在新的仓库中,对于每个引用:
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
refs=$( git stash list --format=%gd ) ... refs=$( git stash list --format=%h | tac )
- mattlawhashes=($(git reflog --format=%H refs/stash)
会给您一个提交哈希列表,可以使用git fetch $oldpath $hashes
检索它们,但仍需要循环执行git stash store
。 - Jonas Hörsch将你的Stash应用到该分支并进行一次提交。
点击你的提交,并从中创建一个补丁文件,将这个补丁文件带上。
进入另一个代码仓库,在那里选择与1)中使用的相同的父分支。
选择操作 / 应用补丁,选择模式:修改工作副本文件,然后应用补丁。现在你的当前工作环境中有来自补丁的未提交修改。
为当前代码仓库创建一个新的Stash。
.git
文件夹通过rsync
同步到另一台计算机。 rsync
仅处理文件更改(比复制快)。rsync
中的--exclude
选项来排除文件,以克服这个问题。rsync
技巧也许是个不错的选择。git --no-pager stash show -p > patch
将暂存的更改复制到一个文件中(patch文件)
git apply path/to/the/patch/file
从patch文件应用stash
下面的shell脚本允许用户将所有的暂存内容从一个文件夹复制到另一个文件夹。 https://gist.github.com/senthilmurukang/29b55a0c0e8694c406991799153f3c43
原帖中的启动命令:
git stash show -p stash@{x} > patch_file
对我来说不起作用(出于某种原因,它创建了无法使用的补丁文件)。相反我要这样做:
git stash apply stash@{x}
git commit
对于每个我想要转移的stash,我将“父”存储库放置在“子”存储库的file:///范围内,并针对每个stash提交执行以下操作:
git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child
这个方法比较复杂,但对我很有用。
git stash save
已被弃用,建议使用git stash push
。 - Ewangit stash show
忽略未跟踪的文件,即使它们已经被存储。 - Andrzej Wąsowskigit 2.32.0
版本发布了,其中增加了[-u|--include-untracked|--only-untracked]
选项,用于显示git stash
中未跟踪的文件。现在我提供的替代命令是git stash push --include-untracked
和git stash show --include-untracked --patch > patch
。请注意,这里的翻译旨在让读者更易懂原文内容,没有额外的解释和其他内容返回。 - Ben Mares