假设我有一个git repo,其工作树和/或索引是“脏”的(即我有尚未提交或隐藏的本地修改)并且我很想做一个“git pull”而没有先提交或藏匿。 (或者,假设我正在向git引入一个新的团队成员,并且他们在他们的本地仓库“脏”时会试图运行“git pull”。)我我想知道在这种情况下做一个“git pull”是多么安全。如果它不安全,那可能发生的最糟糕的事情是什么?如果我从受信任的来源和不受信任的来源中撤出,这是否重要?
到目前为止,我的调查表明,对于我所假设的问题,一系列令人困惑的想法将是一个相当直接的问题。
首先,git-stash手册页听起来像git pull非常安全,并且如果你遇到可能出错的情况,它会中止:
Pulling into a dirty tree
When you are in the middle of something, you learn that there are
upstream changes that are possibly relevant to what you are doing.
When your local changes do not conflict with the changes in the
upstream, a simple git pull will let you move forward.
However, there are cases in which your local changes do conflict
with the upstream changes, and git pull refuses to overwrite your
changes. In such a case, you can stash your changes away, perform a
pull, and then unstash, like this...
到目前为止,在我的简单测试中,这实际上似乎也是如此。
也许暗示“git pull”非常安全,Visual Studio的Git Extensions工具栏有一个突出的拉动按钮,在敲出“git pull”之前不会检查肮脏。 (如果我正在设计一个Visual Studio工具栏,我会尽量避免让自己在脚下射击特别容易。)
git-pull手册页并没有让我的“git pull”声音变得危险,尽管它表明这不是最佳做法:
If any of the remote changes overlap with local uncommitted changes,
the merge will be automatically cancelled and the work tree untouched.
It is generally best to get any local changes in working order before
pulling or stash them away with git-stash(1).
但是你也可以找到肮脏的建议非常糟糕,e.g.:
Avoid git-pull!
git-pull should never get invoked if you have dirty files lying around or if your branch is ahead of master.
This will always lead to some dirty artifacts in the commit history
对于哪种观点最好是一个简单的答案,还是以某种方式逐案处理?
跟进:使用“git pull --rebase”而不仅仅是“git pull”会改变答案吗?在某些情况下,重新定位可能会有own pitfalls,但到目前为止,我的猜测是,使用脏工作树/索引不会使rebase比其他情况更有问题。
答案 0 :(得分:5)
维护Apache DeltaSpike项目的人没有冒犯,但我相信Git手册中有关Git对Delta Spike wiki内容的评价。
还要注意引用的文字(强调我的):
如果您的文件位于附近或者您的分支位于主要之前,则永远不应该调用
git-pull
。这将始终在提交历史记录中导致一些脏工件。
“提交历史记录中的脏工件”是Git合并提交。只要您合并分支而不是在另一个分支上重新定义一个分支的内容,就会发生这种情况。这些合并提交是否“脏”取决于您的项目,您的组织及其意见和政策。
无论如何,git-pull
绝不是危险的操作。如有文件记载,它不会破坏您的任何历史或正在进行的工作。
答案 1 :(得分:3)
根据我的经验,它绝对安全(我使用git大约4年)。如果您有未经修改的更改,通常只是告诉您有一个脏工作副本。
答案 2 :(得分:1)
git pull只是git fetch + rebase / merge,自动合并会产生噪音或意外结果。 (噪声的例子:当你所做的只是在同一个文件中添加一行10次时,你不需要需要 10次合并提交。)如果不知情的人只是做一个git pull并且没有推回检查,噪音将被检查。
我只想说新的团队成员在肮脏的工作树上拉一个git之后更容易迷失方向,无论它是否安全,它将取决于响应(在每次拉动后检查结果将是一个好的开始)。
答案 3 :(得分:1)
到目前为止,我不确定这实际上是否与git pull有关(听起来它预先检测到是否存在合并冲突和中止),但至少注意到合并(即进行git merge)进入一个脏工作树显然会限制你在合并变坏的情况下“撤销”你的合并的能力。特别是,从git-merge手册页:
[merge] --abort
Abort the current conflict resolution process, and try to
reconstruct the pre-merge state.
If there were uncommitted worktree changes present when the merge
started, git merge --abort will in some cases be unable to
reconstruct these changes. It is therefore recommended to always
commit or stash your changes before running git merge.
答案 4 :(得分:0)
git fetch
然后根据从服务器获取的内容进行合并,重新绑定或重置。你可以使用pull,它不会破坏正在进行的工作。然而,前一种方法是首选。
答案 5 :(得分:0)
情景A:
如果提交的提交会与您工作树中未提交的更改发生冲突,那么Git会中止并使您免于使您的仓库变得混乱。
情景B:
如果提交的提交会与您回购邮件中已提交的更改发生冲突,并且您的工作树中未提交的更改也不会发生冲突那么你最终会弄得一团糟。您必须解决冲突并提交,而不会在拉动之前忘记工作树中的更改。
在向Git介绍新的团队成员之后,有时会出现方案B.我的团队中新成员的一个常见错误是在我们的网络驱动器回购中意外/疏忽地更改文件,而不是像他们应该那样在他们的本地克隆上,他们也忘记了这些更改!
顺便说一句,保护自己免受团队错误影响的一种方法是先将本地仓库转移到一个干净的本地仓库,在本地处理任何冲突,然后从您当地的仓库转到您与团队分享的仓库。这个额外的步骤可以防止场景B,或者使脏树对您透明,或者在最坏的情况下,为您呈现场景A.幸运的是,场景A可以作为正常冲突处理,而不会出现场景B的麻烦。