如何检查分支,同时确保我当前分支的所有更改都不会被转移?

时间:2016-10-29 22:38:26

标签: git version-control branch git-checkout

我想要切换分支并让git 始终设置工作目录内容以反映我要切换到的分支的状态。我正在体验这里所述的行为https://web.archive.org/web/20160331103129/http://www.gitguys.com/topics/switching-branches-without-committing - git正在决定是否将与当前分支相关联的工作目录中的某些文件传送到我切换到的分支。

** 这似乎与此处所述https://www.atlassian.com/git/tutorials/using-branches冲突:“签出分支更新工作目录中的文件以匹配该分支中存储的版本......”

在某些情况下,我不希望git做出决定 - 我只是希望Git使工作目录与新分支的状态相匹配。 然而,我不想失去任何改变。我愿意承诺或藏匿先前。

可能?

2 个答案:

答案 0 :(得分:3)

未提交的更改将保留在您的工作树或索引中,直到您告诉git将其提交到何处。

git addgit checkoutgit reset都有--patch选项。工作流程是,做需要做的事情并将其记录在需要记录的地方是单独的任务。通常情况下,你会发现自己正在进行有效的驱动 - 错误修正,在那里你发现一个完整的混乱,某人 通常是我 ,问题是,正在做的工作和做文书工作,但你正盯着工作,确切地知道需要做什么。

git方式 1 是,Do It。在你的工作树中完全正确(这可能涉及一些探索性的分支本身)

  • 然后构建你首先构建的提交系列,如果你确切地知道你一直在做什么。

这是重要的部分。这就是专业,可发布的工作。让人们兴奋的是,git对于之前的混乱部分至少同样重要。

1 哈哈哈他说“git方式”,好像只有一个 lol

答案 1 :(得分:2)

作为jthill said in comments,您需要弄清楚如何处理未跟踪和/或忽略的文件。

此外,您不得处于冲突合并的中间。

所有这一切都有一个简单的解决方案(使用不同的工作树,可能来自不同的克隆,或者如果你的Git足够新,可能来自git worktree)。但是,如果由于某种原因这是不可取的,这里有一些事情需要考虑。让我们采取一个有点假设的例子,但显示一些现实世界的问题。假设您处于回购project,目前位于分支dev-a上:

$ cd project
$ git status
On branch dev-a
You have unmerged paths.
  (fix conflicts and run "git commit") ...

在这种情况下,你真的很困难。你在这里做的任何事都会失去部分合并的状态。如果在合并状态中没有任何重要内容,您可以运行git merge --abort来停止合并,并抛弃冲突的索引,现在我们回到上一个案例。让我们看看Git是否认为一切都很干净。

$ git merge --abort
$ git status
On branch dev-a
nothing to commit, working tree clean

显然,所有 都是干净的。但是等等!

$ cat foo
I am a foo
$ git checkout dev-b
Switched to branch 'dev-b'
$ git status
On branch dev-b
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    foo

nothing added to commit but untracked files present (use "git add" to track)

一切都干净了吗?好吧,文件foo在分支dev-a中被忽略,但不在分支dev-b中,现在它显示为“未跟踪”。我们可以使用git status --ignored中的dev-a来查看它:

$ git checkout dev-a
Switched to branch 'dev-a'
$ git status --short --ignored
!! foo

未跟踪和/或忽略的文件现在将显示为UU!!(在短输出中 - 长输出已如上所示)。

如果您希望只是删除被忽略的文件,则可以git clean使用-x选项(除了常规选项之外)。

如果您想先保存它们,可以使用git stash -a。隐藏代码将进行三次提交,而不是通常的两次提交;第三次提交将保留未跟踪和忽略的文件。 (请注意,git stash -u在第三次提交中仅保存未跟踪的文件,而不保存被忽略的文件。)保存文件后,隐藏代码将删除它们,让您保持干净(如git clean -fdx中所示)工作树。

请注意,一个分支(例如dev-a)中被忽略(因此未被跟踪)的文件不可忽略,因此 未跟踪或< / em>在另一个分支中跟踪(但不是两个),例如dev-bdev-c。如果在foo中忽略了文件dev-a并且您切换到dev-b,那么它就会变得无法跟踪,正如我们所看到的那样。但是,如果它在dev-a中被忽略并在dev-c中跟踪了怎么办?

$ git status --short --ignored
!! foo
$ git checkout dev-c
Switched to branch 'dev-c'
$ cat foo
I am a foo
$ git checkout dev-a
Switched to branch 'dev-a'
$ cat foo
cat: foo: No such file or directory

foo跟踪文件dev-cdev-a忽略文件dev-a,因此当我们从dev-c切换到dev-c时,它会被删除(因为这就是改变了从dev-a$ git diff --name-status dev-c dev-a A .gitignore D foo 的提示提交要求):

foo

这里有另一个非常棘手的案例。请记住dev-adev-b 被忽略 I am a foo\n未跟踪dev-c中包含dev-adev-c中。正如我们刚刚看到的,从dev-c切换到$ git rev-parse --abbrev-rev HEAD dev-a $ echo 'If the foo s.its, wear it' > foo $ git checkout dev-c Switched to branch 'dev-c' $ cat foo I am a foo dev-a中提取了版本。这是真的无论我们放入什么

dev-b

让我们回到foo并再次回到我们扭曲的Foo Bird笑话,这一次,让我们步骤通过分支(并提示提交)$ git checkout dev-a Switched to branch 'dev-a' $ echo 'If the foo s.its, wear it' > foo $ git checkout dev-b $ git status --short ?? foo $ git checkout dev-c error: The following untracked working tree files would be overwritten by checkout: foo Please move or remove them before you switch branches. Aborting ,其中文件git status未被跟踪,而不是被忽略:

git status

这是因为被忽略的文件也是 clobberable (符合clobber的?)文件,但未跟踪的文件不是。在Git的一点思绪中,git checkout期间没有关于不应该抱怨的路径名的概念(即,--skip-worktree被忽略,并且在跳过时跳过在某个目录中添加“所有”文件),但也珍贵(绝不能被--assume-unchanged破坏。)

所有这些都进一步复杂,因为索引中标记的文件带有git worktreeOption Explicit Sub foo() Dim K As Long Const MinDeg As Long = 10 Const MaxDeg As Long = 13 Dim sK As String, I As Long Const MyCoe As Long = 3 Const MyErr As Long = 5 Dim OutPutStr As String For K = MinDeg To MaxDeg sK = "" For I = 1 To Len(CStr(K)) sK = sK & ChrW(832 & Mid(CStr(K), I, 1)) Next I OutPutStr = Trim(OutPutStr & "a" & sK & " = " & _ Str(MyCoe) & " ± " & _ Str(MyErr) & Chr(10)) Next K Cells(1, 1) = OutPutStr End Sub 标记。我没有测试过这些额外的角落情况 - 但是通过使用单独的工作树可以避免所有这些情况,而不是试图将所有内容塞入单个工作树中。 (原因是单独的工作树也意味着一个单独的索引。{{1}}代码可以很好地完成这个,或者你可以简单地在本地克隆存储库,这在可能的情况下足够聪明地共享文件。)