我从GitHub克隆了一个git存储库,进行了一些更改和一些提交;我做了很多,而且都很脏,所以它们不适合拉取请求。现在,我从cleanchanges
创建了分支origin/master
,所以它很干净,我希望将所做的更改作为一次提交并提交一个不错的提交注释。
当我在本地主机上时,我想切换到cleanchanges
,但不更改文件。然后我可以提交。
如何在不更改文件的情况下切换分支?
我想说清楚:我已在本地master
中提交了所有更改。没有未提交的更改。
编辑:我刚刚注意到您说您已经创建了一些提交。在这种情况下,请使用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的设计宗旨是在不先询问您的情况下就不会放弃工作。
Git。切换到另一个分支
git checkout branch_name
[如果是这样,您想rebase您的提交,将它们压缩为单个提交。
我不确定您到底想要什么,所以我不会用脚本吸引您。但是我建议您阅读git rebase
和“壁球”选项,然后尝试一些操作。
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
分支返回到与存储库中相同的提交。
git fetch && git checkout <branch_name>
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>
。
git fetch && git checkout branch_name
(“ branch_name”这里是分支的名称)然后您将看到消息,切换到新的分支“ branch_name”设置分支“ branch_name”以跟踪“ origin”中的远程分支“ branch_name”。