Git是分布式的,且本质上并无中心一说,只是一般把GitHub或者自己搭的Git远程库当成一个中心仓库。远程库和本地库一样,都是根据.git/
目录的内容来知道有哪些版本以及版本的具体改动。
回退和前进的基本操作
Git中的HEAD指针指向的版本就是当前版本,回退或前进版本都是在改HEAD指针。前面学过,在本地库上回退k个版本可以:
git reset --hard HEAD~k
在本地库上回退或前进版本可以:
git reset --hard 足够唯一标识版本号的非空活前缀
然后提交到远程库,就只需要再git push
一下。回退时需要-f
强制更新:
git push -f origin master
但是在这之前需要注意远程库和本地库是不是一样的,如果最后一次提交是自己提交的,那肯定是一样的了,自己回退再push上去没问题,在本地库上回退并强制更新以后,git reflog
也能看到所有的版本号:
这时如果在本地库上再做版本前进,然后再提交到远程仓库:
这时远程库上的版本就前进了:
清除别人提交的错误版本
因为push
提交上去的其实就是有.git
版本库的,所以如果有人在自己之后提交了错误的东西,比如没有提交到自己的分支上:
拿自己的再git push -f
一遍就又变回自己的了:
需要注意的是因为是把自己的.git
库强制更新了上去,别人提交的那个版本在自己的仓库上git reflog
是看不到的:
如果需要找回那个版本,就需要到对方的本地库,或者在从他push到自己强制更新这段时间内有人clone或者pull的仓库里找了。
git pull
前面的远程库版本操作还有一种情况,就是因为其他人在该分支上的提交导致远程库的版本和本地库不一样,并且其他人没有错误提交。
如果这段时间自己什么改动都没做,也就是本地库的版本是远程库中从某个版本之前的版本,那么就只要git pull
拉一份最新的下来:
如果自己也做了改动,那在这个分支上就很麻烦了,所以在Git上应该多使用分支,避免多人的提交发生这种冲突。