git第二篇:常用命令

git clone:

从远程主机克隆一个版本库:git clone <版本库地址> <本地目录名>。如git clone https://github.com/jquery/jquery.git。这将在本机生成一个jquery目录,因为远程主机的版本库名称是jquery。如果我们想指定不同的目录名,则可以git clone https://github.com/jquery/jquery.git myJquery。git clone不仅支持HTTP(s)协议,还支持SSH、Git协议。

 

git remote:

为了便于管理,git要求每个远程主机都有一个主机名。git remote用于管理主机名。git remote 可列出所有远程主机。git remote -v 可以查看所有远程主机及其地址。git clone版本库时,远程主机默认命名为origin。如果想用其他主机名,则在git clone可以用-o选项指定,如git clone -o jquery https://github.com/jquery/jquery.git。

git remote show <主机名>,可以查看该主机的详细信息。如git remote show origin

git remote add <主机名> <地址>,用于添加远程主机。

git remote rm <主机名>,用于删除远程主机。

git remote rename <原主机名> <新主机名>,用于重命名远程主机。

git remote prune origin:清除远程分支缓存。有时我们在A端删除了某个远程分支,但是在B端还能看到这个远程分支,删除这个远程分支时失败,此时执行这个命令后,在所有的地方都看不到这个远程分支了。

 

git branch:

查看所有本地分支:git branch。查看所有远程分支:git branch -r。查看所有本地分支和远程分支:git branch -a,远程分支以remotes/origin/XXX显示。

重命名本地分支xx:git branch -m old_branchName new_branchName,或者在要改名的分支上git branch -m new_branchName

删除本地分支xxx:git branch -D xxx

切断当前本地分支与远程分支的跟踪关系:git branch --unset-upstream

 

git checkout:

git checkout A:切换为本地A分支,如果本地没有A分支,则会建一个follow远程A分支的本地A分支,如果远程没有A分支,则会报错。

git checkout -b A:在当前本地分支的基础上,新建一个本地分支A。

在远程master分支的基础上新建一个xxx分支:git checkout -b xxx origin/master。注意此时xxx分支其实是follow远程master的。我们可以通过git branch -vv命令来查看本地各分支follow的远程分支。这个时候应该先把本地xxx分支推送到远程xxx分支上,git push -u origin xxx,会自动创建远程xxx分支,并且把本地xxx分支和远程xxx分支关联上。如果我们远程分支名不想叫xxx,而是想叫yyy,则可以git push -u origin xxx:yyy,这样远程就会新建一个yyy分支。同样可以用git branch -vv验证。git push -u origin local_branch_name:remote_branch_name可以执行任意多次,假如remote_branch_name每次都不一样,则每次都会新建一个远程分支,并与本地分支关联。

 

git fetch:

获取远程分支的更新。git fetch <远程主机名> <分支名>

远程分支有新增的话,必须先执行本命令,才能在本机checkout,否则会报 'origin/xxx' is not a commit and a branch 'xxx' cannot be created from it 错误。

当想获取所有分支的更新时,分支名可以省略。远程主机名和分支名都省略时,表示获取所有远程主机的所有分支的更新。

如获取origin远程主机aaa分支的更新:git fetch origin aaa。注意这里origin不能省略,不然会把aaa当成远程主机名,就会报错。

获取origin远程主机所有分支的更新:git fetch origin

 

git pull

获取远程分支的更新,并merge进本地分支。git pull <远程主机名> <远程分支名>:<本地分支名>

如获取origin远程主机master分支的更新,merge进本地aaa分支:git pull origin master:aaa。如果是把远程分支merge进当前分支,则冒号及之后可以省略。如远程master分支merge进当前分支:git pull origin master。

 

git push

git push <远程主机名> <本地分支名>:<远程分支名>

第一次push时,要用上面的git push -u。

把本地abc分支推送到远程xxx分支:git push origin abc:xxx

删除远程分支xxx:git push -d origin xxx

 

git reset

git reset --hard 还原本地所有更改

git reset --hard commitid 还原到指定commitId。注意,是还原到,所以想还原到哪里,就提供那个commitId。假如提供的commitId是前天提交的,那么这两天的提交记录都会消失。

 

git revert用于回退远程分支,一般加上-n选项。-n等同于--no-commit,如果不加-n选项,那么回滚几个commitId,就要写几次commit,加了-n,只需在最后一次commit and push即可。 

git revert -n HEAD 撤销最新一次commit

git revert -n HEAD~1 撤销倒数第二次commit

git revert -n HEAD~2  撤销倒数第三次commit

git revert commitId 撤销指定的commit

git revert还支持指定范围的撤销,git revert -n fromCommitId..endCommitId。左开右闭,会回滚endCommitId,但不会回滚fromCommitId。如果endCommitId是最新的commitId,那么就会回滚到fromCommitId上。和git reset不同,git revert会保留中间的提交记录。

把分支回滚到之前某一个版本:

A->B->C->D,A是好的,B、C、D是有问题的,想回滚到A。ABCD都是commitId。

第一种方法:用git reset

git reset --hard A

git push -f

必须要有-f参数,否则会报错,提示Updates were rejected because the tip of your current branch is behind。

有些公司会设置禁止这种情况下的强制push,此时,这个方法就失效了,只能用git revert。

第二种方法:用git revert

git revert -n A..D

commit and push

或者git revert -n B^..D。^代表前一次的commitId,^^代表前两次的commitId,依次类推。B^就是A,C^^也是A。

 

git merge

git merge --squash other_branch_name,之后再commit and push。这样子merge,push后只会有一条commit记录,不会有other_branch_name的一大堆commit记录。

 

git log:展示所有的commit记录,可以看出commitId、commit注释、commit人和commit时间。

git log --pretty=oneline:展示所有的commit记录,每条记录占一行,只能看出commitId和commit注释。

查看最新的commmitID:

git log --pretty=oneline | awk '{print $1}' | sed -n '1p'

或者

git rev-parse HEAD

 

查看远程分支是谁建的、最后一次提交是什么时候:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n

如果只想看某个远程分支,则可以在最后面加上grep

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | grep branchName

 

git clean

git clean -df:删除没有git add的文件

如果只是想dry run,即看看会删除哪些文件,则可执行git clean -ndf

posted on 2015-07-25 15:28  koushr  阅读(299)  评论(0编辑  收藏  举报

导航