我想要切换分支并让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使工作目录与新分支的状态相匹配。 然而,我不想失去任何改变。我愿意承诺或藏匿先前。
可能?
答案 0 :(得分:3)
未提交的更改将保留在您的工作树或索引中,直到您告诉git将其提交到何处。
git add
,git checkout
和git 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-b
和dev-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-c
,dev-a
忽略文件dev-a
,因此当我们从dev-c
切换到dev-c
时,它会被删除(因为这就是改变了从dev-a
到$ git diff --name-status dev-c dev-a
A .gitignore
D foo
的提示提交要求):
foo
这里有另一个非常棘手的案例。请记住dev-a
中dev-b
被忽略 I am a foo\n
,未跟踪,dev-c
中包含dev-a
在dev-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 worktree
或Option 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}}代码可以很好地完成这个,或者你可以简单地在本地克隆存储库,这在可能的情况下足够聪明地共享文件。)