我从GitHub克隆了一个git存储库,进行了一些更改和一些提交;我做了很多而且都很脏,所以它们不适合拉动请求。现在我从cleanchanges
创建了分支origin/master
,所以它很干净,我希望将我的更改作为一个提交提交,并提交一个很好的提交注释。
当我在本地主人身上时,我想切换到我的cleanchanges
,但不更改文件。然后我就可以投入了。
如何在不更改文件的情况下切换分支?
我想说清楚:我已在本地master
中提交了所有更改。没有未提交的更改。
答案 0 :(得分:54)
编辑:我刚注意到你说你已经创建了一些提交。在这种情况下,使用git merge --squash
进行单次提交:
git checkout cleanchanges
git merge --squash master
git commit -m "nice commit comment for all my changes"
(修改:如果您有未提交的更改,则以下答案适用。)
只需使用git checkout cleanchanges
切换分支即可。如果分支引用相同的引用,那么当您切换时,所有未提交的更改都将保留在您的工作目录中。
只有在origin/master
和cleanchanges
之间存储库中的某个文件不同时才会发生冲突。如果您刚刚创建了分支,那么没问题。
与往常一样,如果您担心失去工作,请先制作备份副本。 Git的目的是在不先问你的情况下不丢弃工作。
答案 1 :(得分:38)
<强> GIT中。切换到另一个分支
git checkout branch_name
答案 2 :(得分:9)
最好的办法是stash更改和切换分支。要切换分支,您需要一个干净的状态。因此,存储它们,签出新分支并在新分支上应用更改并提交
答案 3 :(得分:1)
听起来你做了改变,让他们一路上掌握,现在你想把它们组合成一个提交。
如果是这样,你想要rebase你的提交,将它们压缩成一个提交。
我不完全确定你想要什么,所以我不会用脚本来诱惑你。但我建议你阅读git rebase
以及“挤压”的选项,并尝试一些事情。
答案 4 :(得分:1)
另一种方法是,如果要创建新提交而不是执行合并:
git checkout cleanchanges
git reset --hard master
git reset cleanchanges
git status
git add .
git commit
第一次(硬)重置会将您的工作树设置为与master
中的最后一次提交相同。
第二次重置会将你的HEAD放回原位,指向cleanchanges
分支的尖端,但不更改任何文件。所以现在你可以添加和提交它们。
之后,如果你想删除你从master
做出的脏提交(假设你还没有推过它们),你可以:
git checkout master
git reset --hard origin/master
这将丢弃所有新提交,将本地master
分支返回到与存储库中的分支相同的提交。
答案 5 :(得分:0)
最简单的方法如下:
git fetch && git checkout <branch_name>
答案 6 :(得分:0)
为什么不只是git reset --soft <branch_name>
?
演示:
mkdir myrepo; cd myrepo; git init
touch poem; git add poem; git commit -m 'add poem' # first commit
git branch original
echo bananas > poem; git commit -am 'change poem' # second commit
echo are tasty >> poem # unstaged change
git reset --soft original
结果:
$ git diff --cached
diff --git a/poem b/poem
index e69de29..9baf85e 100644
--- a/poem
+++ b/poem
@@ -0,0 +1 @@
+bananas
$ git diff
diff --git a/poem b/poem
index 9baf85e..ac01489 100644
--- a/poem
+++ b/poem
@@ -1 +1,2 @@
bananas
+are tasty
但是要注意的一件事是,当前分支更改为original
。在此过程之后,您仍然留在上一个分支,但是可以轻松git checkout original
,因为它是相同的状态。如果您不想丢失之前的HEAD
,则应注意提交参考,并在此之后进行git branch -f <previous_branch> <commit>
。
答案 7 :(得分:0)
干净地切换到另一个分支 cleanchanges
并保留当前工作区文件 - 没有副作用或中间提交:
# starting from master
git switch --detach # to not move the current branch
git reset cleanchanges
git switch cleanchanges
这也与未提交的更改无关,甚至不会更改时间戳。
要保留索引(暂存区)并分别查看脏更改和先前清理的文件与 cleanchanges
头的差异,请执行以下操作:
# starting from master
git switch --detach # to not move the current branch
git reset --soft cleanchanges
git switch cleanchanges
答案 8 :(得分:-1)
git fetch && git checkout branch_name
(“ branch_name”是分支的名称)
然后您将看到消息, 切换到新的分支“ branch_name” 设置分支“ branch_name”以跟踪“ origin”中的远程分支“ branch_name”。