git协作常用命令

1,616 阅读6分钟

以下为git常用的命令的总结,方便大家查阅与参考:

以下文章中,远程仓库表示git clone 来源的仓库,上游仓库是git add <remote>的仓库;

概念解析

借用图来说明:

  • 几个概念:

    • workspace:工作区,也就是我们写代码的地方,它持有实际的文件;

    • index:也可以叫做stage,暂存区,它实际上就是一个包含文件索引的目录树 ,当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新。

    • local repository:本地仓库,我们使用“git commit”时,实际是把代码提交到了本地仓库;

    • remote repository:远端仓库,当我们使用“git push”时,才将我们的本地代码提交到了远端的仓库,比如github上。

  • origin

    • 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。

常用命令

克隆仓库:

克隆本地仓库:

git clone /path/to/repository

克隆远端服务器仓库:

git clone username@host:/path/to/repository

设置上游仓库

设置上游仓库,就可对上游仓库的代码进行fetch等操作,多用于协同开发;

git remote add <name> <url>

url是远程仓库的的地址,这么设置后,可用name代替url;

查看上游仓库

查看所有上游仓库分支:

git branch -r

查看所有上游仓库名字:

git remote

查看所有上游仓库名字和git地址:

git remote -v

删除上游仓库:

git remote rm <remote>

替换已有的上游分支的url:

git remote set-url <remote> <url> //这会使原本关联的remote的url替换成新的url

分支

创建仓库的时候,

master

是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。

创建一个feature_x分支,并且切换到feature_x分支上:

git checkout -b feature_x //不加-b则是切换到某一分支上

删除分支:

git branch -d feature_x

查看当前所处分支:

git branch

查看包括上游仓库与远程仓库所有分支:

git branch --all

拉取更新

git fetch //拉取远程仓库更新到本地仓库,默认为git clone的那个仓库;
git fetch <name> <branch> //拉取远程仓库名为<name> 的 某一分支<branch>上的代码,<branch>可省略;

如果我们有多个remote都需要更新,可以使用:

git remote update
//或者
git fetch --all

合并更新

如果有冲突,则要手动合并;

在合并之前可以选择性执行如下操作:

git diff <name>/<target_branch>//比较本地工作区与上游仓库特定分支的差别;
git stash //保存当前更改到缓存区
git merge <name>/<target_branch> //将上游仓库的特定分支代码合并到本地;
git stash pop //将缓存区代码提出到本地,并修改冲突;

快捷操作:

git pull //相当于git fetch和git merge的两部操作  

强制更新远程仓库的代码到本地(慎用):

git merge --rebase 

rebase与merge区别参考链接:hackernoon.com/git-merge-v…

存储到缓存区以及拉取缓存区内容

缓存区存放工作区文件改动内容,当执行git stash后,所有改动被放到缓存区,并且工作区恢复到没有改动之前。

git stash
git stash pop

添加到暂存区

添加到暂存区(index):

git add <filename>;//添加单个文件;
git add . //git 2.0 以上添加所有改动;
git add -u //添加修改某些文件和删除某些文件的改动,但不添加新建文件的改动;

提交和推送改动

提交暂存区的改动到本地仓库:

git commit -m "代码提交信息"

推送本地仓库改动到远程仓库,比如要提交到master分支上:

git push origin master

强制推送(慎用):

git push --force

查看当前状态

列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件:

git status

查看记录

查看所有commit记录:

git log

git log常用选项:

选项说明
-p按补丁格式显示每个更新之间的差异
–stat显示每次更新的文件修改统计信息
–shortstat只显示 –stat 中最后的行数修改添加移除统计
–name-only仅在提交信息后显示已修改的文件清单
–name-status显示新增、修改、删除的文件清单
–abbrev-commit仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
–relative-date使用较短的相对时间显示(比如,“2 weeks ago”)
–graph显示 ASCII 图形表示的分支合并历史
–pretty使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)

限制输出长度

  • 除了用 -n 来限制输出 log 的条数,还可以用 --since--until 按照时间作限制。

  • --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。

回滚

执行git reset --hard commit_id

例如我们需要回退到新增MVC模式的上一个版本,则执行:

git reset a5f2a27f02d32b666e01c24ed2218598db57a183 //此为默认方式,不带任何参数的git reset它回退到某个版本,只保留源码,回退commit和index信息

如果是--hard参数,则彻底回退到某个版本,本地工作区也会变为上一个版本的内容:

git reset --hard a5f2a27f02d32b666e01c24ed2218598db57a183

如果是--soft参数,会保留工作区和暂存区的记录,在下次可以直接commit:

git reset --soft a5f2a27f02d32b666e01c24ed2218598db57a183

这种情况下在push时,要执行:

git push --force 

比较提交

比较当前工作区与暂存区之间的差异:

git diff

比较暂存区与本地仓库之间的差异:

git diff --cached

比较当前工作区与本地仓库之间的差异:

git diff Head

比较当前工作区与另外一个分支的差别,比如分支为test:

git diff test

比较当前工作区与暂存区有哪些文件被改动,改动了多少行:

git diff --stat

比较两个分支的操作:

git diff <source_branch> <target_branch>

交互式的rebase

列出即将push的所有git commit ,编辑这些commit,可以对这些commit进行合并,修改,丢弃,编辑,拆分操作:

git rebase -i  //会打开编辑器,可修改commit记录
git rebase -i <after-this-commit> //当前分支中的所有提交

rebase 参考链接git-scm.com/docs/git-re…

rebase 拆分commit参考链接:www.codebelief.com/article/201…/

参考链接

git简易指南:www.bootcss.com/p/git-guide/

git协同开发:www.cnblogs.com/arkenstone/…

github文章借鉴:github.com/WarpPrism/B…

gitbook:gitbook.liuhui998.com/index.html