git实用命令大全

Git,当下主流的版本控制工具,功能强大,说主流也无可厚非。但是大部分开发者依旧过度依赖于IDE或现有工具的界面化git操作,日子一久,难免生疏,遂整理了这篇平常实战中宝典。

概念

  • 工作区(disk working )
    即当前的工作目录
  • 暂存区(staging area)
    即通过git add命令改动的文件就存入了暂存区
  • 本地仓库(local repo)
    即通过git commit命令改动的文件就存入了本地仓库
  • 远程仓库(remote repo)
    即通过git push命令改动的文件推送到了远程仓库

基本操作

1. git clone

从远程git repo创建一个本地拷贝,本地repo以url最后一个斜线后的名称命名

  • 指定名称
git clone <url> <newname> 
  • 指定分支
git clone -b <branch-name> --single-branch <url>

2. git add

将本地工作区的改动添加到暂存区

  • 添加指定文件
git add <file-name>
  • 添加当前目录下所有文件
git add .

3. git commit

将暂存区的内容改动提交到本地仓库

git commit -m "commit-message"
  • 修改上一个commit描述内容
git commit --amend
  • 修改作者名称
git commit --amend --author='Author Name <email@address.com>'

4. git push

将当前分支merge到远程关联的分支

  • 若分支已经存在则更新,不存在则添加
git push -u <alias> <branch-name>
  • 已关联远程分支
1. git branch -vv   查看关联远程分支名称
2. git push  直接push到远程对应的分支

5. git fetch

拉取远程仓库的内容更新和分支更新

  • 获取指定repo更新
git fetch <alias>
  • 获取所有repo更新
git fetch --all 

6. git merge

把一个分支合并到当前分支

1. git checkout <branch-name>    检出目标分支
2. git merge <alias>/<branch-name>   merge到目标分支
  • 若产生冲突
1. git mergetool 手动解决冲突
2. git diff   对比
3. git add   将改动添加到暂存区

7. git pull

从远程仓库拉取内容并merge到当前分支,pull = fetch + merge,首先执行git fetch,然后执行git merge,把原来分支HEAD merge到当前分支,然后产生一个新的commit

  • 改变pull的merge操作,实用rebase方式
git pull --rebase

8. git rebase

将本地的所有提交临时保存为补丁(patch),放在”.git/rebase”目录中,然后将当前分支更新到最新的分支尖端,最后把保存的补丁应用到分支上。

$ git checkout <target-branch>
$ git rebase <origin-branch>    将target-branch更新为最新的origin-branch,再把保存的patch应用到target-branch

在rebase的过程中,也许会出现冲突(conflict)。处理完冲突后,我们通过以下命令来进行rebase操作:

$ git add .  更新内容索引(index),将改动添加到暂存区
$ git rebase --continue  继续应用(apply)余下的补丁
$ git rebase --abort  任何时候,可以用--abort参数来终止rebase的行动,并且分支会回到rebase开始前的状态

9. git remote

remote主要用于管理项目关联的远程仓库,通过别名来标识远程主机

  • 展示所有远程仓库
git remote   
  • 展示每一个别名对应的实际仓库地址
git remote -v 
  • 添加一个新的remote repo
git remote add <alias> <url>
  • 删除一个存在的仓库
git remote rm <alias>   删除一个存在的remote alias.(如果添加的时候提示已经存在,则可以使用该命令先删除alias再添加)
  • 更新远程仓库的主机地址
git remote set-url <alias> <url>   更新url. 可以加上—push和fetch参数,为同一个别名set不同的存取地址.

10. git branch

用来列出分支,创建分支和删除分支

  • 列出本地所有分支
git branch
  • 列出本地和远程分支
git branch -a
  • 列出远程分支
git branch -r
  • 列出本地所有分支最近一个提交
git branch -v
  • 展示所有的分支关联的远程仓库
git branch -vv
  • 创建分支
git branch <branch-name>  基于上一次提交创建的分支
  • 删除分支
git branch -d <branch-name>
  • 删除远程分支
推送代码到远程的关联分支
git push <远程主机名> <本地分支名>:<远程分支名>

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支

git push <alias> :<remote-branch-name>
等同于
git push <alias> --delete <remote-branch-name>

11. git checkout

  • 创建一个本地分支track远程的分支
git checkout -b <branch-name> <alias>/<branch-name>
  • 切换到一个已存在分支
git checkout <branch-name>
  • 快速切换分支
git checkout -
  • 放弃工作区指定文件的修改
git checkout -- <file-name>  删除该文件中所有没有暂存和提交的改动,这个操作是不可逆的,-- 可以不加
  • 放弃工作区所有的改动
git checkout .
  • 把A分支的某一个commit,放到B分支上
1. git checkout <b-branch-name>
2. git cherry-pick <commit SHA>
  • 新建并切换到新分支上,同时这个分支没有任何commit
git checkout --orphan <branch-name>
  • 从stash中拿出某个文件的修改
git checkout <stash@{n}> -- <file-path>

12. git tag

建立书签

  • 展示当前分支的最近的tag
git describe --tags --abbrev=0
  • 在最近一个commit(通常release版本)上建立书签
git tag -a <version-number>   需要输入tag信息
  • 在指定历史commit SHA上建立书签
git tag -a <version-number> <commit SHA>
或
git tag -a <version-number> -m "发布(描述)" <commit SHA>
  • 将指定tag 同步到远程仓库
git push <alias> <local-version-number>
  • 将所有tag 同步到指定远程仓库
git push <alias> --tags
  • 删除本地标签
git tag -d <tag-name>

13. git stash

将当前工作区、暂存区的改动压入栈(不包括为track的文件),保留为上一次commit后的clean状态

  • 存储当前的修改,但不用提交commit
git stash
  • 保存当前状态,包括untracked的文件
git stash -u
  • 展示压入栈内的改动
git stash list
  • 取出stash栈顶的项目应用于当前工作目录
git stash apply
  • 取出stash栈内指定项目应用于当前工作目录
git stash apply stash@{3}
  • 回到最后一个stash的状态,并删除这个stash
git stash pop
  • 清空stash栈中的所有项目
git stash clear

14. git clean

移除工作目录中未track的文件

  • 移除所有untracked文件
git clean -f
  • 强制删除untracked的文件
git clean <file-name> -f
  • 强制移除untracked的目录
git clean <directory-name> -df    -d参数表示同时移除目录,-f表示强制执行。在git的配置文件中, clean.requireForce=true,如果不加-f,clean将会拒绝执行.

15. git rm

移除文件

  • 移除工作区的文件,同时也从暂存区移除
git rm <file-name>
  • 仅移除暂存区文件,工作区保留
git rm --cached  功能上等同于git reset HEAD,清除了缓存区,但不动工作目录树
例如:移除被git track的文件
git rm --cached app.iml   
git commit -m 'remove file that in gitignore but already tracked by git'

16. git reset

撤销改动和提交

  • 把暂存区的指定file放到工作区中
git reset <file-name>
  • 撤销所有暂存区的改动,恢复回工作目录
git reset HEAD   通常应用于误add进暂存区的文件
  • 撤销指定的暂存区的改动
git reset HEAD <filename>
  • 还原工作区、暂存区的所有改动到提交历史尖端
git reset HEAD --hard
  • 还原到指定的commit SHA
git reset --hard <commit SHA>  reset命令会抹去某个commit id之后的所有commit

总结:
git reset --mixed id 是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变). 取消了commit和add的内容.
git reset --soft id 实际上,是git reset –mixed id 后,又做了一次git add.即取消了commit的内容.
git reset --hard id 是将git的HEAD变了,文件也变了.例如:git reset --hard de7fc4f
按改动范围排序如下:
soft (commit) < mixed (commit + add) < hard (commit + add + local working)
不带soft和hard参数的git reset,实际上带的是默认参数mixed.

17. git revert

撤销提交

  • 撤销最近的一个提交
git revert HEAD   revert会创建一个反向的新提交,可以通过参数-n来告诉Git先不要提交

18. git diff

比较文件的改动

  • 对比工作区和暂存区域快照之间的差异
git diff
  • 对比暂存区和上次提交时快照之间的差异
git diff --cached
  • 对比工作区和上次提交时快照之间的差异
git diff HEAD
  • 对比两个分支的差异
git diff <branchA> <branchB>
  • 对比两个分支分离后的改动
git diff <branchA>…<branchB>
  • 对比本地仓库中任意两个commit之间的文件变动
git diff <commit SHA><commit SHA>

19. git log

展示分支的提交历史

  • 图形化地表示出分支合并历史
 git log --oneline --graph
  • 显示特定分支的log
git log <branch-name>
  • 查看在分支1,却不在分支2中的提交
git log --oneline <branch1> ^<branch2>
  • 展示commit关联的分支、tag信息
git log --oneline --decorate
  • 展示指定作者的提交历史
git log --author=<author name>
  • 展所有作者的提交历史描述
git shortlog
  • 限制输出数量
git log -n    n替换为需要输出的数量
  • 根据commit信息过滤log
git log --grep=<keywords>
  • 查看每次commit的diff
git log -p   每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch
或
git log --stat  展示每个改动的介绍,--stat比-p的输出更简单一些
或
git show <commit SHA>

20. git status

查询repo的状态

  • 简略展示暂存区和工作区的状态
git status -s

高级使用

1. 回到远程仓库的状态

抛弃本地仓库的所有版本(commit)【以及工作区中的内容】,回到远程仓库的状态

1. git fetch --all 
2. git reset --hard <alias>/<branch-name>

2. 重设第一个commit

也就是把所有的改动都重新放回工作区【即不被git管理】,并清空所有的commit,这样就可以重新提交第一个commit了

git update-ref -d HEAD

3. 修改上一个commit的描述

1. git commit --amend
2. vim编辑描述

4. 查看某段代码的作者

git blame <file-name>

5. 显示本地执行过git命令

git reflog   类似shell的history命令

6. 提交时修改作者名

git commit --amend --author='Author Name <email@address.com>'

7. 给git命令起别名

git config --global alias.<handle> <command>
比如:git status 改成 git st,这样可以简化命令
git config --global alias.st status

8. 展示文件

git ls-files -t   展示所有tracked的文件
git ls-files --others   展示所有untracked的文件
git ls-files --others -i --exclude-standard   展示所有忽略的文件

9. 重命名分支

git branch -m <new-branch-name>

10. 执行rebase之前自动stash

git rebase --autostash

11. 从远程仓库根据ID,拉下某一状态,到本地分支

git fetch <alias> pull/<commit id>/head:<branch-name>

12. 清除gitignore文件中记录的文件

git clean -X -f

13. 展示忽略的文件

git status --ignored

14. 展示任意分支某一文件的内容

git show <branch-name>:<file-name>

15. 强制推送

git push -f <remote-name><branch-name>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容