常用Git命令清单名次解释
下面是我整理的常用 Git 命令清单。几个专用名词的译名如下: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一. 新建代码库# 在当前目录新建一个Git代码库" C( ~% ?' q+ i3 i, X( p, q$ git init6 |( H5 g7 U" G, j' p1 r' f # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]( `3 q1 ^* H% ^- r: ]& ~% D 二.配置 Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置) # 显示当前的Git配置( H& j6 v( w/ T% K$ git config --list/ e; n2 m" }& w4 ` : b- r/ ]! W0 k+ @; u$ r # 编辑Git配置文件 $ git config -e [--global]* M1 r8 Q. O, O3 n" `9 ?% S) V- G, T 5 b! H* S* K; B- K U # 设置提交代码时的用户信息3 ~: |+ t3 D3 J5 M3 W5 |( ~ J+ z $ git config [--global] user.name "[name]"% o. y1 ^" C1 N H5 M0 M% e $ git config [--global] user.email "[email address]"! s3 g! O5 z0 {. v0 H. d( y4 @ 3 E7 t+ Q; d5 | # 颜色设置 git config --global color.ui true # git status等命令自动着色2 I3 @' \- w4 T# t. c# w7 @ git config --global color.status auto I' [) q1 R* c- |; Y* M. O git config --global color.diff auto git config --global color.branch auto( _3 S" J+ K0 |7 T git config --global color.interactive auto git config --global --unset http.proxy # remove proxy configuration on git) E! P7 K9 m7 u+ ^- a8 ]( U 三. 增加/删除文件# 添加指定文件到暂存区* K. E4 W7 ^# \; F( l& I $ git add [file1] [file2] ... 9 O; ~8 _' X% } # 添加指定目录到暂存区,包括子目录 $ git add [dir]# P2 {& V2 _8 N # 添加当前目录的所有文件到暂存区 $ git add . # 添加每个变化前,都会要求确认7 ]5 q9 a8 H+ R C( l* O7 m2 i # 对于同一个文件的多处变化,可以实现分次提交 $ git add -p9 M$ t( x% x: j; t$ I # 删除工作区文件,并且将这次删除放入暂存区5 q9 z2 a6 A. e! I3 X6 j $ git rm [file1] [file2] ...: p$ Z/ r( \7 ?2 x) B, U ( ~/ x' S+ p( a7 X$ K) [( c+ h # 停止追踪指定文件,但该文件会保留在工作区 $ git rm --cached [file] # 改名文件,并且将这个改名放入暂存区8 G% P9 e3 Z9 }9 ~! T/ t $ git mv [file-original] [file-renamed]$ R6 r4 J1 c7 e6 M$ Z+ t; W) ~' O 四. 代码提交# 提交暂存区到仓库区* x6 Q/ a( I/ D t! v' E $ git commit -m [message]4 l. s' y: u0 C/ Q# } Z ) @1 v$ n' g3 `0 C# P5 P- h% ? # 提交暂存区的指定文件到仓库区 $ git commit [file1] [file2] ... -m [message]5 V$ d) w# _- \: g' O # 提交工作区自上次commit之后的变化,直接到仓库区 $ git commit -a 9 W1 g3 |9 s, \% O( b! u! { # 提交时显示所有diff信息' }) p; J% p: h7 D: O $ git commit -v , m/ A4 ~/ q( H* Q: | # 将add和commit合为一步 $ git commit -am 'message' 0 j! L# N/ f$ W* L* c1 D- d- u9 q # 使用一次新的commit,替代上一次提交7 ^8 p' [4 Q# L. V, z6 ]3 N: J # 如果代码没有任何新变化,则用来改写上一次commit的提交信息 $ git commit --amend -m [message]+ R- o T$ l% ]7 g6 b 7 O, o. j3 ^& f9 E) i # 重做上一次commit,并包括指定文件的新变化7 `- `# Q3 ~9 k j# y- z5 N $ git commit --amend [file1] [file2] .../ i! f5 z. P v/ U n! V* c 五. 分支# 列出所有本地分支 $ git branch . W% `0 X1 w C# N# _& f8 o) U! ^ # 列出所有远程分支1 T; N2 c$ w9 p5 X: \9 `# }' @ $ git branch -r1 ~! \$ y% @6 l/ E- t7 n" v0 N- } # 列出所有本地分支和远程分支) _! @3 d0 _3 i* B $ git branch -a8 ^: L/ Z1 ?. J3 `3 z) V # 新建一个分支,但依然停留在当前分支, L6 y& G) `% g& r $ git branch [branch-name]; i( ~- o, z8 k/ x # 新建一个分支,并切换到该分支 $ git checkout -b [branch] # 新建一个分支,指向指定commit2 l3 q$ A1 w* G# Y( W $ git branch [branch] [commit]) h' [1 H8 E6 \ # 新建一个分支,与指定的远程分支建立追踪关系! x @. S- k" Z' N: t( |" k. p9 O- E $ git branch --track [branch] [remote-branch]- [7 l0 i7 h; ]" S5 q0 n7 p) w # 切换到指定分支,并更新工作区' K1 k. @6 y$ s' o! A' i7 C, g $ git checkout [branch-name]- h& \: f$ b' J m2 y% |6 | # 切换到上一个分支 $ git checkout - 2 t% I# Z( Z3 Q # 建立追踪关系,在现有分支与指定的远程分支之间+ n' h/ y4 R7 o8 S $ git branch --set-upstream [branch] [remote-branch] " x* r# f. U+ C9 x3 x: s$ p # 合并指定分支到当前分支 $ git merge [branch]% y/ T7 j- l6 d2 V- e ( b6 j7 K, A$ C' m& x( ~ # 选择一个commit,合并进当前分支2 D1 X! E8 a1 O4 L" l. ~6 U $ git cherry-pick [commit]; k! c, d# u: a 6 I, \, V! L/ x d; T # 删除分支( x9 q' @* w/ z% e) N $ git branch -d [branch-name]1 W2 B* p# J! _ H3 x2 P! ` 5 ^% i# A% |. q- S! c4 H # 删除远程分支* O6 ]/ ~' C d $ git push origin --delete [branch-name] $ git branch -dr [remote/branch] # 检出版本v2.0 $ git checkout v2.0 # 从远程分支develop创建新本地分支devel并检出 $ git checkout -b devel origin/develop+ ~0 M3 O8 ?3 u4 s, M 3 z3 d* ~$ L( g8 x0 N+ \% v # 检出head版本的README文件(可用于修改错误回退)$ |% @9 a9 J! V2 V& s1 o git checkout -- README 六. 标签# 列出所有tag $ git tag- y" Z9 F1 I( ]) S% J% i( p4 h # 新建一个tag在当前commit5 _8 [$ p" }; R9 T4 t/ x: o $ git tag [tag] U8 F! X3 g; o$ k' h! L # 新建一个tag在指定commit- D" o+ I0 |$ b. z& B# W4 I $ git tag [tag] [commit], {3 {4 ]- @- g$ |0 N% o k # 删除本地tag $ git tag -d [tag]$ K) M$ f& c/ s, _# A # 删除远程tag% Y6 M: j; E9 t v4 e $ git push origin :refs/tags/[tagName]; v1 g2 f8 W+ @+ B1 o# {" s4 S! R # 查看tag信息1 t7 |- t9 c* ?+ d# M% y $ git show [tag] # 提交指定tag4 n# V; w5 I$ Y- p; `& y6 g" R $ git push [remote] [tag]* w+ \8 E. v: ]# r" Q& | i # 提交所有tag9 x5 a) l" u; G7 M/ ^# n' r1 t $ git push [remote] --tags # 新建一个分支,指向某个tag* _. E6 U2 m& v2 [, [6 @ $ git checkout -b [branch] [tag] 七. 查看信息# 显示有变更的文件, U% i. J/ E) w2 V# s# h $ git status # N. k; p8 i( V # 显示当前分支的版本历史3 k7 d7 r7 K$ ]/ a: Q0 H $ git log # 显示commit历史,以及每次commit发生变更的文件( G+ y; h- T& G: L $ git log --stat ! c" p" z! {3 t" | # 搜索提交历史,根据关键词 $ git log -S [keyword]4 T& _" K5 S }/ G # 显示某个commit之后的所有变动,每个commit占据一行, A4 ~3 R5 _. N9 E- u# e5 _ $ git log [tag] HEAD --pretty=format:%s1 N3 _6 J$ I% _2 B2 R8 s4 Q ! f" }5 ?& O9 S: f # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件 $ git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件改名 $ git log --follow [file]- m4 c) x4 I" E2 @4 h $ git whatchanged [file]8 q" K% a& a$ N9 X5 p5 E% \ F3 g # 显示指定文件相关的每一次diff4 c9 j) Y' ~' M$ L $ git log -p [file] # 显示过去5次提交* p+ z; `" j) [: f9 I& c# S $ git log -5 --pretty --oneline: s# m6 } ?: p s# U # 显示所有提交过的用户,按提交次数排序 $ git shortlog -sn) e1 P' N7 c# I, u9 J, a- b( D # 显示指定文件是什么人在什么时间修改过1 \) @1 R: Y9 K $ git blame [file] / y( c# S, I1 U' ~1 y # 显示暂存区和工作区的差异 $ git diff 8 Y( e! e& ^, W: ` # 显示暂存区和上一个commit的差异 $ git diff --cached [file] : H, W3 J% b: Z3 A7 T # 显示工作区与当前分支最新commit之间的差异( V' S$ P6 I c: P# Z. f $ git diff HEAD # 显示两次提交之间的差异6 r; r! M' W4 s. J) j# d. h) j $ git diff [first-branch]...[second-branch] . J9 S+ Z" g7 a, A( q6 h # 显示今天你写了多少行代码1 m3 O9 l4 r. @; T, @2 V0 [ $ git diff --shortstat "@{0 day ago}"1 \7 T1 G. l0 J9 w5 G8 `! z # 显示某次提交的元数据和内容变化 $ git show [commit] # 显示某次提交发生变化的文件, m/ n5 {' z3 W& L" P/ F# G! B $ git show --name-only [commit] # 显示某次提交时,某个文件的内容 $ git show [commit]:[filename] * I9 F9 i, m/ X- R2 l0 K # 显示当前分支的最近几次提交 $ git reflog) C/ s0 E( G1 K+ ^ 八. 远程同步# 下载远程仓库的所有变动 $ git fetch [remote]4 E3 A/ o0 H% b: @9 b2 u # 显示所有远程仓库 $ git remote -v 7 ^2 j0 _ P) N+ A. j # 显示某个远程仓库的信息 $ git remote show [remote] # 增加一个新的远程仓库,并命名 $ git remote add [shortname] [url]& r1 N/ [6 v+ N$ h9 V2 c 8 ^1 ?& S3 O& Q3 t- S4 X. K. s4 M # 取回远程仓库的变化,并与本地分支合并) v V; C% r+ E0 |$ J/ K* n! U $ git pull [remote] [branch]- C' f l# W; Z! Q' U # 上传本地指定分支到远程仓库 $ git push [remote] [branch]7 P& Z" g# P% m" a: Q ; P- A" U. v2 A& k1 I # 强行推送当前分支到远程仓库,即使有冲突 $ git push [remote] --force # 推送所有分支到远程仓库 $ git push [remote] --all 九. 撤销# 恢复暂存区的指定文件到工作区( g j1 U: e. K) O2 ] $ git checkout [file] ! ~! h& G( D3 h" ]; S # 恢复某个commit的指定文件到暂存区和工作区( Y, ] Q1 c$ x$ K9 ?! N $ git checkout [commit] [file] # 恢复暂存区的所有文件到工作区 $ git checkout .- n1 Z( O& |, w8 ^" c3 {( O) p ; C: i2 k9 L; G" T4 ?+ d # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变. B$ F* }+ J5 O6 m& F( k0 u $ git reset [file] # 重置暂存区与工作区,与上一次commit保持一致) M/ R( K( H7 x: B7 ?3 q $ git reset --hard) A7 ?% n9 N+ O5 @) N: ~0 E # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变6 E2 w" ^4 T! b% `- F) D- \ c $ git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致! Q3 ?- w$ `- t; ` $ git reset --hard [commit]1 S! |7 C7 n, c# c # 重置当前HEAD为指定commit,但保持暂存区和工作区不变 $ git reset --keep [commit] / C. F5 P7 O8 ?! h. U # 新建一个commit,用来撤销指定commit g1 }; V& h u8 [ # 后者的所有变化都将被前者抵消,并且应用到当前分支% g; t, C/ k* g6 K \6 k) z! f/ u $ git revert [commit] 9 [: h6 L9 c; I- e" E # 暂时将未提交的变化移除,稍后再移入! ^. p; Z# ~* G" R9 K( h $ git stash $ git stash pop9 I) u! `! u! Y/ ~# l3 L: A 十. 其他git init # 初始化本地git仓库(创建新仓库)6 s# A9 K, g( u: I2 m git config --global user.name "xxx" # 配置用户名) r/ l$ o# E' g0 d& T: G/ q: l git config --global user.email "xxx@xxx.com" # 配置邮件; i. x. s& l1 ] D git config --global color.ui true # git status等命令自动着色 git config --global color.status auto git config --global color.diff auto git config --global color.branch auto4 J5 n8 D/ t% F k! |+ Y+ a8 ] git config --global color.interactive auto5 F* O: Z/ z7 s! F( n- e) L( a- C git config --global --unset http.proxy # remove proxy configuration on git git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库5 c7 l. p, ~6 c5 { git status # 查看当前版本状态(是否修改)% R1 Z2 _1 {. T7 d git add xyz # 添加xyz文件至index git add . # 增加当前子目录下所有更改过的文件至index2 h% u3 u0 I$ { git commit -m 'xxx' # 提交 git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改). ]' P, G0 i/ ~, V0 @" Q; C git commit -am 'xxx' # 将add和commit合为一步$ G' q) t% h2 J" V$ T. I ` git rm xxx # 删除index中的文件 git rm -r * # 递归删除 git log # 显示提交日志+ {) M$ Z) N _( H; U) Y git log -1 # 显示1行日志 -n为n行 git log -5 git log --stat # 显示提交日志及相关变动文件8 [% F" s. ?5 K; ^- C3 ?2 |- r git log -p -m git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容 git show dfb02 # 可只用commitid的前几位 git show HEAD # 显示HEAD提交日志 git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本 git tag # 显示已存在的tag. y8 p8 a9 c" S* s# U' I git tag -a v2.0 -m 'xxx' # 增加v2.0的tag git show v2.0 # 显示v2.0的日志及详细内容 git log v2.0 # 显示v2.0的日志 git diff # 显示所有未添加至index的变更 git diff --cached # 显示所有已添加index但还未commit的变更 git diff HEAD^ # 比较与上一个版本的差异# [% T2 U; F) O5 B8 f* g' E) u( Y git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容; ]0 `5 c5 E! B git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)- [- |* v! H; Y1 T6 d4 M; Z git branch # 显示本地分支% } U7 q% k6 v' f M7 b" _ git branch --contains 50089 # 显示包含提交50089的分支 git branch -a # 显示所有分支0 D# a# Q. [ Z) J; l0 } git branch -r # 显示所有原创分支7 D5 j& F3 K' N/ C1 W git branch --merged # 显示所有已合并到当前分支的分支4 ^+ F) z$ C9 F1 K git branch --no-merged # 显示所有未合并到当前分支的分支 git branch -m master master_copy # 本地分支改名 E( b. k6 A7 E" m. W8 U git checkout -b master_copy # 从当前分支创建新分支master_copy并检出 git checkout -b master master_copy # 上面的完整版: P& z) R3 {, |$ T6 t4 |- l3 [ git checkout features/performance # 检出已存在的features/performance分支 git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支) r7 y, g2 k$ i+ X+ @. D git checkout v2.0 # 检出版本v2.0 git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出7 q" n) Z5 X% H* t+ `, ^9 N git checkout -- README # 检出head版本的README文件(可用于修改错误回退) git merge origin/master # 合并远程master分支至当前分支 git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改3 g; m- S B0 S* { git push origin master # 将当前分支push到远程master分支1 @4 }* o) i# ?9 |* G git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支 git push --tags # 把所有tag推送到远程仓库! w+ D$ N( I( E* ]) | git fetch # 获取所有远程分支(不更新本地分支,另需merge) git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支 git pull origin master # 获取远程分支master并merge到当前分支 git mv README README2 # 重命名文件README为README2- [4 [% B' H; u6 u git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退) git rebase git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支) git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933% J( ?+ [9 l$ i0 w& `" I& Q git ls-files # 列出git index包含的文件) e. Y( M, ]3 Q' I- m$ ^$ m) e- ?# X+ |! U git show-branch # 图示当前分支历史 git show-branch --all # 图示所有分支历史& E, B2 L7 `# s git whatchanged # 显示提交历史对应的文件修改; f1 _3 e, @8 n& n4 r- ^+ P% G git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e3928183 [8 e9 @* X1 Z) W f3 b: @5 J git ls-tree HEAD # 内部命令:显示某个git对象 git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH git reflog # 显示所有提交,包括孤立节点9 e7 C0 d5 v- d. X git show HEAD@{5} git show master@{yesterday} # 显示master分支昨天的状态 git log --pretty=format:'%h %s' --graph # 图示提交日志0 n6 A1 @0 s6 j: r8 q0 E( f. V6 A: }3 R git show HEAD~39 V+ w8 O$ G) G git show -s --pretty=raw 2be7fcb476 git stash # 暂存当前修改,将所有至为HEAD状态 git stash list # 查看所有暂存1 H3 \. z. D9 n6 R: ~ git stash show -p stash@{0} # 参考第一次暂存/ m' M2 D/ c- C0 ~7 x8 p! [/ s git stash apply stash@{0} # 应用第一次暂存 git grep "delete from" # 文件中搜索文本“delete from”3 ` B1 N B6 |' I% K+ r9 z git grep -e '#define' --and -e SORT_DIRENT git gc git fsck # 生成一个可供发布的压缩包 $ git archive |
微信公众号
手机版