gpt4 book ai didi

git - 从 stash rebase ,奇怪的结果

转载 作者:太空狗 更新时间:2023-10-29 12:48:57 26 4
gpt4 key购买 nike

我只是出于好奇才问这个问题。在现实生活中还有其他方法可以处理这种情况,但我发现 git 的以下行为有点奇怪。

总结:存储在幕后创建了两个提交,一个包含索引,另一个包含未添加的编辑。如果我们检查后者并尝试对其进行 rebase ,我们不知何故只能从索引中获得更改。这是为什么?

详细示例如下:

首先让我们创建一个包含一次提交的 repo,然后是添加到索引的更多编辑,然后是未添加到索引的更多编辑,然后是存储:

git init
echo 1 > a.txt
git add a.txt
git commit -m"First commit"
echo 2 >> a.txt
git add a.txt
echo 3 >> a.txt
git stash
git log --all --graph --oneline

* 5c00fc0 WIP on master: c8af537 First commit
|\
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit

所以 git stash 似乎将索引和未添加的编辑都保存为具有它们自己的哈希的提交(在我的例子中,索引为 965c986,未添加的编辑为 5c00fc0)。

现在编辑一个新文件并提交:

echo x >> b.txt
git add b.txt
git commit -m"Second commit"

所以现在所有的提交看起来像:

git log --all --graph --oneline

* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|/ /
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit

比如说,我们现在想要获取 stash 的编辑并将它们与第二次提交 merge 。还有其他方法可以做到这一点(比如 git stash apply,但是如果我们已经清理了 stash,然后从 reflog 中挖掘提交会怎么样),但让我们尝试一下:

git checkout 5c00fc0
[warning message here]
cat a.txt
1
2
3
git rebase master
First, rewinding head to replay your work on top of it...
Applying: index on master: c8af537 First commit

但是现在,生成的文件 a.txt 只是:

cat a.txt 
1
2

这是整个图表:

git log --all --graph --oneline
* 5fc3ade index on master: c8af537 First commit
* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|/ /
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit

看起来,即使我们检查了提交 5c00fc0,rebase 也只应用了提交 965c986 中的更改,即我们 stash 时索引中的编辑。但是 5c00fc0 中的内容已被忽略。

问题:这是为什么?对这种行为有一些合理的解释吗?还是应该将其视为错误?

最佳答案

事实证明,git 只是(默认情况下)在 rebase 时忽略 merge 提交。存储会创建 WIP 提交和索引提交,WIP 提交是 merge ,因为它同时具有索引提交和 c8af537 作为父项。

与存储本身无关。

关于git - 从 stash rebase ,奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17849201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com