如何使用Git丢弃本地提交?

时间:2014-12-30 13:54:08

标签: git github atlassian-sourcetree

我在本地存储库中有一些提交。在远程服务器中,有人提交更多。

如何放弃我的本地提交? (但保留提交)

我想我需要使用git reset或git rebase或git checkout?或者类似git revert的东西?

我对这些命令感到很困惑。

2 个答案:

答案 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}

“软重置”将删除所有提交,但保留对文件的更改。然后你可以做一些非常丑陋的事情,比如重新完成整个重置。再一次,可能不是你想要的。