我在我的开发分支中有一些未提交的更改,并且我使用它们进行了存储git stash,但是有些更改在那些被隐藏的更改中非常重要.有没有办法找回这些变化?
此外,我已经在存储的代码文件之上做了一些更改.
如果可能的话,我是否有可能检索到新分支的藏匿更改?
我知道如何解决这个问题:
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
Run Code Online (Sandbox Code Playgroud)
但是,是不是有办法让git pull做stash和pop舞蹈给我吗?
如果此命令具有不同的名称,则可以.
创建shell别名git stash; git pull; git stash pop是一种解决方案,但我寻找更好的解决方案.
我进了一个分店做了一些工作.我想进入另一个分支,但不想承诺,所以我做了git stash.然后我做了git checkout <otherbranch>.我在那里做了一些工作,就像在第一个分支中一样,我想在提交工作之前切换它.所以我git stash也在那里.我切换回第一个分支并尝试解除它(git stash pop)认为它将从该特定分支获取存储.我感到惊讶的是它从<otherbranch>最近的藏匿中释放了藏匿物.我的印象是存储是特定于分支的,但是这种行为表明整个本地存储库只有一个存储.
是git stash分支特定的还是整个存储库?如果是整个存储库,我可以将选项传递给它以使其特定于分支吗?
我的git工作流程经常使用rebase.我总是取上游的变化(主要回购我从分叉),然后合并到我的树枝,然后重订去除无用的(对我说:d)合并的提交和树分裂.
这个工作流程中的一件事让我烦恼的是:
$ git rebase upstream/master
Cannot rebase: You have unstaged changes.
Please commit or stash them.
$ git stash
Saved working directory and index state WIP on cc: abc1234 Merge remote-tracking branch 'upstream/master' into local_branch
HEAD is now at abc1234 Merge remote-tracking branch 'upstream/master' into local_branch
$ git rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: awesome code change
$ git stash pop
Run Code Online (Sandbox Code Playgroud)
所以这里我们有4个命令,1 =失败的rebase,2 = stash,3 = rebase,4 = stash pop.除了3之外的任何东西都是无意识的工作
所以,问题是:最推荐的自动化方法是什么?每次都运行git …
我正在尝试使用一系列单元测试进行预提交钩子,我想确保我的工作目录是干净的.编译需要很长时间,所以我希望尽可能利用重用编译的二进制文件.我的脚本遵循我在网上看到的例子:
# Stash changes
git stash -q --keep-index
# Run tests
...
# Restore changes
git stash pop -q
Run Code Online (Sandbox Code Playgroud)
这会导致问题.这是repro:
// Step 1到a.javagit add .// Step 2到a.javagit commit
git stash -q --keep-index #存储更改git stash pop -q #恢复更改此时我遇到了问题.该git stash pop -q显然有冲突,a.java我有
// Step 1
<<<<<<< Updated upstream
=======
// Step 2
>>>>>>> Stashed changes
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个流畅干净?
不太确定发生了什么,但是git stash似乎处于一个不好的地方.
% git stash list
stash@{0}: filter-branch: rewrite
stash@{1}: filter-branch: rewrite
stash@{2}: On mysolr: start mysolr stuff
Run Code Online (Sandbox Code Playgroud)
没关系,并且git show stash@{0}工作正常.但:
% git stash drop
'' is not a stash reference
% git stash pop
'' is not a stash reference
% git stash drop stash@{0}
'stash@{0}' is not a stash reference
Run Code Online (Sandbox Code Playgroud)
我过去常常使用git stash而不是碰到这个.我最近重写了历史记录,以便在发布到github之前从历史记录中删除文件.我跑的命令是
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch FILENAME' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)
任何想法如何修复藏匿?
我可以在没有内容的情况下在藏匿处列出修改过的文件的名称吗?
在搜索时,我只发现打印整个差异的人,无法仅查看文件名.
当存储一些更改时,Git会创建两个单独的提交,"分支上的WIP"和"分支上的索引":
$ git log --graph --all
* commit 98aac13303ca086580c1ec9ccba5fe26c2a8ef3c
|\ Merge: 7d99786 82c5c76
| | Author: Tieme <my@email.com>
| | Date: Wed Nov 19 09:58:35 2014 +0100
| |
| | WIP on development: 7d99786 Last real commit
| |
| * commit 82c5c763357c401135675a39bfabf9b7f6805815
|/ Author: Tieme <my@email.com>
| Date: Wed Nov 19 09:58:35 2014 +0100
|
| index on development: 7d99786 Last real commit
|
|
| * commit 7d9978637a0e1ef92f2432189bdebf2317f0b2f0
| Author: Tieme <my@email.com>
| Date: Tue Nov 18 …Run Code Online (Sandbox Code Playgroud) 我想隐藏未跟踪的文件,但我继续传递错误的选项.对我来说这听起来是对的:
git stash save [-a|--all]
Run Code Online (Sandbox Code Playgroud)
但实际上这也隐藏了文件.正确的是:
git stash save [-u|--include-untracked]
Run Code Online (Sandbox Code Playgroud)
当我运行git stash save -a并尝试git stash pop它时,我得到所有被忽略文件的无数错误:
path/to/file1.ext already exists, no checkout
path/to/file1.ext already exists, no checkout
path/to/file1.ext already exists, no checkout
...
Could not restore untracked files from stash
Run Code Online (Sandbox Code Playgroud)
所以命令失败了.
如何恢复跟踪和未跟踪的更改?git reflog不存储存储命令.
我认为他们应该基本相同,但是当我尝试时
$ git stash show -p stash@{N}
Run Code Online (Sandbox Code Playgroud)
和
$ git show stash@{N}
Run Code Online (Sandbox Code Playgroud)
后者显示了一些额外的提交信息,但实际的差异要短得多.(前者显示了大约十二个文件,但后者只有一个.)
那么,两者之间究竟有什么区别,为什么它们不同?
我还可以依赖于git diff stash@{M} stash@{N}正确的事情吗?