Git:如何在提交之间来回移动
我有一个关于Git的新手问题:
我需要在一个分支的历史中来回移动。 这意味着,我需要将所有文件都置于旧版本中的状态,然后我需要回到存储库中的最新状态。 我不需要提交。
有了SVN,它会是
svn up -r800
去修订800,和
svn up
与存储库保持同步。
我知道我想回到提交的散列,所以我尝试了
git reset <hash>
这似乎让我在那里。 但后来我尝试了
git pull
但是抱怨冲突。
那么在分支的历史中移动的正确方法是什么?
我在考虑SVN,所以不要犹豫,指点我一些很好的教程。 请注意,我已经检查过http://git.or.cz/course/svn.html和http://www.youtube.com/watch?v=8dhZ9BXQgc4。
谢谢,昂德拉。
那么,我也是一位前svn用户,现在我的所有项目都使用git。
在使用git时,应该改变svn中使用的客户端 - 服务器体系结构的思维方式。 在svn中,每个更改都需要与服务器建立连接。 使用git,您的repo位于工作目录中。 您不需要每个回购操作的连接。
只能使用git push
和git pull
来与repo同步。 想想像使用rsync或任何备份解决方案,使两个地方有完全相同的内容。 就像连接外部备份硬盘一样,然后使其中的内容与主内容相同。 这就是git pull
和git push
的用法。
如果你只是想回顾历史,可以使用git checkout
。 使用git history
查看版本ID。 如果您使用Linux,请使用gitk
查看修订树。 在Windows中,tortoise git可以使用修订图显示它。
要回到最新版本,请使用git checkout master
。 在做任何命令之前,请始终让自己做git status
。 此命令将显示您需要了解的当前回购条件的任何信息,以及您需要采取哪些措施才能使其正确。 在做git pull
和git push
,最好确保git status
结果包含文本working directory clean
。
如果你需要将文件恢复到之前的版本,你可以用git merge
。 在执行文件之前,先用git diff
测试。 例如: git diff rev1:rev2 filename
。 它会打印出两个版本之间的任何不同。 rev1中的更改将被rev2中的更改所取代。 所以要恢复,rev2将会比rev1更早。 在满足差异结果之后,使用git merge
,只需要用merge
替换diff
,所有其他参数保持不变。
我希望这可以帮助你。 主要的关键是看你的工作目录是你的回购。 理解这将帮助你使用git来完成它的功能。 祝你好运。
您可以使用git checkout
检出任何提交,然后将其与分支名称一起使用以返回到指定的分支。
使用提交标识而不是分支名称的git checkout
会将您从任何命名分支移到离开的头部。
如果你使用git reset
那么它会将你的分支移回到旧状态,孤立那些可能不是你想要的更新的提交。
其他答案都是信息丰富的,但我相信这与OP想要的最接近:
将这两个函数添加到〜/ .bashrc中:
# checkout prev (older) revision
git_prev() {
git checkout HEAD~
}
# checkout next (newer) commit
git_next() {
BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/(.*)|1|' | grep -v HEAD | sort | uniq`
HASH=`git rev-parse $BRANCH`
PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
git checkout $PREV
}
用法:
$ git_prev
Previous HEAD position was 7042c8a... Commit message2
HEAD is now at d753ecc... Commit message1
$ git_next
Previous HEAD position was d753ecc... Commit message1
HEAD is now at 7042c8a... Commit message2
注意:这些命令总是输入分离的HEAD状态。 如果您从当前签出的分支中git_prev
然后git_next
,您将最终返回最新版本,但您将处于分离的HEAD状态。 做git checkout BRANCH_NAME
恢复正常。