我在本地存储库中有一些提交。在远程服务器中,有人提交更多。
如何放弃我的本地提交? (但保留提交)
我想我需要使用git reset或git rebase或git checkout?或者类似git revert的东西?
我对这些命令感到很困惑。
答案 0 :(得分:1)
假设您已经提交了更改,那么我将使用rebase(除非您仍在处理您的更改,然后您可能希望将它们保留在本地副本中)。
Rebase将比较两个分支,并弹出当前分支的更改(例如您的本地更改),拉出另一个分支(例如远程),并逐个重播您的更改
当您已提交更改时,Rebase会起作用。例如,
master: A - B - C
origin/master: A - B - D
在origin / master上重新设置master将其转换为
master: A - B - D -C
git pull
有一个方便的选项 git pull --rebase
我倾向于也喜欢使用交互式rebase,这为您提供了更大的灵活性,允许您重命名提交,重新排序,将它们压缩到其他提交等等。
git rebase -i origin/master
对rebase的一个警告是,它将重新创建它所重新提交的所有提交。这意味着他们都将获得新的SHA,并且Git不会将它们识别为相同的提交
编辑:
如果你不想改变那么你应该可以使用重置。
git reset <commit>
在下面我添加一个“错误提交”,并希望回滚我的日志,同时保持我的工作副本中的错误提交的更改。我使用HEAD~1别名,但你也可以给它一个SHA。
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git log origin/master -1
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c
Author: Josh Bodah <jb3689@yahoo.com>
Date: Thu Dec 18 17:55:14 2014 -0500
generate tags in change_version
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git log -2
commit b925445207000905d535e715a06d312ca65be5c1
Author: Josh Bodah <jb3689@yahoo.com>
Date: Tue Dec 30 09:31:36 2014 -0500
bad commit
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c
Author: Josh Bodah <jb3689@yahoo.com>
Date: Thu Dec 18 17:55:14 2014 -0500
generate tags in change_version
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git log origin/master -1
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c
Author: Josh Bodah <jb3689@yahoo.com>
Date: Thu Dec 18 17:55:14 2014 -0500
generate tags in change_version
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git reset HEAD~1
Unstaged changes after reset:
M README.md
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git log -1
commit 8fd6a1a7704d2c0dc1323c4d8e5e169c169c833c
Author: Josh Bodah <jb3689@yahoo.com>
Date: Thu Dec 18 17:55:14 2014 -0500
generate tags in change_version
Bodah@jbodah-local 2.1.3p242 ~/repos/spy_rb (master) $ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
答案 1 :(得分:1)
使用
git revert {commit hash}
您可以使用git log查找提交哈希(它是字母和数字的字符串)。这将“恢复”(在记事本中像撤消一样工作)你的提交,但保持原样。之后,有人可能想恢复您的恢复,所以最好离开它。
其他人发布了关于
的信息git reset --hard {commit hash}
这可能不是你想要的。这将删除所有提交以及从HEAD开始到提供的{commit hash}的文件更改。
git reset --soft {commit hash}
“软重置”将删除所有提交,但保留对文件的更改。然后你可以做一些非常丑陋的事情,比如重新完成整个重置。再一次,可能不是你想要的。