Git命令快速参考
* e; j, o$ n( l* ~* {
9 U1 R) {! J0 i1 z2 R8 a$ `Git Command Quick Reference. L7 k* O: E, z2 o: g3 |5 M5 C8 x
# R! n' P& G6 P/ L) |- q
本附录为Git常见命令快速参考。每节介绍一种操作类型。2 l/ e6 b2 q! g& N
这里会列出很多命令,而相应的解释却不多。对于还不熟悉Git的读者,可回头翻阅第1章“Git的版本控制之道”(第3页)。6 m$ g4 s" e0 \; v; H7 _ j4 ]
$ v/ ~! A+ f6 y" |7 a' L3 ?+ U3 JA.1安装和初始化
9 h8 d: F3 O# y9 vSetup and Initialization
* Q8 w/ z/ A9 B$ x8 @! `" \1 j9 t% H5 a: C0 W+ h# z- c7 \2 _* ?
在使用Git之前,须要先进行配置。在使用一个新的版本库之前,须要先初始化。本节介绍与Git设置和初始化相关的命令。& G; V3 V" M+ x
& U/ Q) |- z: E/ ~( s
配置全局用户名和电子邮件地址
?; [ ~+ J- w0 Cprompt> git config --global user.name "Your Name"
6 S+ M- O m3 w8 |) k- Sprompt> git config --global user.email "you@example.com"" b; C& J" U- Y# i" u
为特定的版本库配置用户名和电子邮件地址2 i( n) A* F; `; T$ b5 K0 E: ~
4 ?. u3 N6 p ~
注意:你可以为每个版本库单独设置用户名和邮件地址。这使得用户可在不同项目中使用不同的用户名和/或不同的邮件地址。
8 R1 I0 _9 G% Z
3 }/ H! h2 }# Uprompt> cd /path/to/repo; K/ s" Q3 \2 X
prompt> git config user.name "Your Name"1 O$ p7 n( V9 {, ~9 @1 Y
prompt> git config user.email
; R3 H3 }- p0 l9 L- }5 G1 h: p2 U7 s
在命令行中使用不同颜色显示不同内容6 r2 O: [" _2 N$ Y
prompt> git config --global color.ui "auto"
9 X Y6 _4 e" G& U
. Y& p: v) ^& l$ E& h$ a7 K初始化新版本库, o, q) b- G& e% m2 |
prompt> mkdir /path/to/repo
' [9 ^# U# [* B. _6 ~prompt> cd /path/to/repo0 `+ k9 e+ T5 F, W
prompt> git init. r2 ^1 U& |% ?* U' u2 }, x7 a
Initialized empty Git repository in /path/to/repo/.git/- m% g9 `9 d+ K7 X2 k" c* L2 b
prompt>- c/ ^: M3 z$ V; {
... create file(s) for first commit ...2 [3 `+ l' J2 f8 q. _2 l+ g
prompt> git add ." V: V; q$ a6 l/ J' T8 n% a- Y
prompt> git commit -m 'initial import'
4 m1 A2 j, i6 [7 S3 z: zCreated initial commit bdebe5c: initial import- G# C: _& s3 f* D8 V
# o" k; s1 V. Y$ N1 files changed, 1 insertions(+), 0 deletions(-)* D* a# S7 W/ G2 `
- H, L) S: y* i/ I% ]& _# p
create mode 100644 & K; G% ^1 a# c
% f' Q3 S9 s" N克隆版本库# E% M6 [# h! `& r$ q
prompt> git clone 8 E2 C! M3 ^+ e
Initialize repo/.git+ z; t$ J/ L& n4 H J( J8 w
Initialized empty Git repository in /work//.git/
: N7 `" D, t O3 P3 v" ~8 e% [9 S
$ m) n [* l: C) U' w将目录中的内容纳入Git版本控制, T$ w6 V/ [) z/ w) w
prompt> cd /path/to/existing/directory
: {. r/ K# C' O( T9 U8 rprompt> git init
/ N: a ~9 a8 J& q$ M6 ?Initialized empty Git repository in /path/to/existing/directory/.git/% n& C2 M# T" P) s' y8 s- X
prompt> git add .
. [* M' s& Q( b$ t) Lprompt> git commit -m "initial import of some project"
: k3 S& o- Z* u! w/ i& h7 ?# n) B
在本地版本库中设置远程版本库的别名5 p% h( L) l" p0 y; s" t3 d
... from within the repository directory ...: n) b" n0 o5 Z4 C o: f3 c
prompt> git remote add
& M$ d q) Z V$ ?: R8 r
& _( \' N% o' n2 e' q4 H: e, R. w( d + i' }9 W+ f* s$ g' _2 A
/ B: i, ~6 b* F3 B' aA.2 日常操作# b& p* O; ?3 {- D& D W; @
Normal Usage
1 M7 L! T4 x& n7 y6 m7 |; t- e2 W, I; V1 E1 ^5 Z7 I4 s
本节列出Git日常操作命令,对应于第4章“添加与提交:Git基础”(第41页)。; i( f& l+ d& D% x
+ W3 H# k5 ?% J
添加新文件或暂存已有文件上的改动,然后提交2 _% q/ H: u5 V9 J
prompt> git add 8 U0 T* j c/ R( v
prompt> git commit -m ""+ i7 x; r- `+ f5 k4 s
, v! A& m0 W, H1 p9 J: J暂存已有文件上的部分修改
& @8 D! ?* E a& g* A8 }4 O注意:[...]表示可选参数。
0 d' o$ r! z6 m. o) y, [' K9 [1 r C$ z" p6 J
prompt> git add -p [ [ [and so on]]]
% o1 V/ E, O$ @8 |0 k选择要提交的文本块……! U- m3 G6 S/ ^3 d6 M( } B
: y& A. ]/ ]$ H; D* P' L# u& e使用交互方式添加文件
2 a( m' G5 [3 o% e( q) c5 y- [prompt> git add -i9 P0 A* f" u" W$ s
& N* _" T( u8 M1 d+ T- L0 W
暂存已纳入Git版本控制之下的文件的修改
" z# E- O; h3 E3 {prompt> git add -u [ []]
' d5 U" \9 M6 ], M" [
# F4 y9 |0 l+ K& N. V' n提交已纳入Git版本控制之下的文件的所有修改$ h& I+ F5 Q! R& Q2 J
prompt> git commit -m "" -a
+ b( j; w5 w, i1 S5 i/ _* V" U8 }0 M# V
清除工作目录树中的修改
3 ~+ x9 N; ]$ N9 Y1 Eprompt> git checkout HEAD []
* M" [1 e2 U3 N
I! z8 q( R6 ~1 E' c取消已暂存但尚未提交的修改的暂存标识2 y+ @# Z/ O) T v- Q
prompt> git reset HEAD []' m# `" B! A3 |2 h5 j" H
4 Z8 o9 ?7 x7 u- t# I1 p修复上一次提交中的问题; ]/ A3 `7 C4 U1 ~6 _5 O( ?
9 b1 ] X' m% E8 Z' m改动相关文件,并暂存……
3 s" R6 q3 E8 U! I8 d" B- z1 P9 mprompt> git commit -m "" --amend( z# e, \2 }+ x+ W5 R0 K3 n5 Y
' \% |0 K( }, r) x& B! m- r r
修复上一次提交中的问题,并复用上次的提交注释
5 E6 o k; n$ x+ Kprompt> git commit -C HEAD --amend
6 u! [! ?& q" [2 a. l! c
/ Z6 t; F' {. |" s & P9 J( ^: G) g/ N4 _' e
8 _; q9 M3 y* s( @; z" U
A.3 分支) _3 l/ a& x' @
Branches
- v3 O; D, B4 D0 j2 I0 f5 y0 a( V, {
/ @* `5 [$ Y6 c, \) U$ \1 q分支是Git的强项之一。本节介绍关于分支的各个命令。详细内容见第5章“理解和使用分支”(第55页)。
" I1 m( O" W s* d- Q) v: q/ `0 j% F0 v7 P
列出本地分支
8 i( g5 _ [+ {% U) \7 zprompt> git branch
8 B9 y! `1 L$ i% H& d2 J* N) l2 h
列出远程分支, j, a2 b+ c9 \4 G; q* F; ?6 R
prompt> git branch -r4 Y0 }% M2 r) J: x9 p0 g' u P5 {
& ?, ?$ Y+ x w, e C3 R列出所有分支
/ E% C( u4 n+ t) Sprompt> git branch -a& u& C! S" f7 a3 ?3 ~
( Q- P* N# o- {/ P8 K
基于当前分支(的末梢)创建新分支! ]7 `6 g& m; {3 g+ C
prompt> git branch
( T/ |& z$ l4 n+ }; e) x" ]4 A, h! `+ ]) o
检出另一条分支 F6 s) N; m& n
prompt> git checkout / N; R* H' d2 D; j
# K- F7 N2 y" A8 d3 i. C基于当前分支创建新分支,同时检出该分支' G1 f6 Y* F+ d0 ^; e+ x
prompt> git checkout -b
. b; l, i, s$ S0 F3 { Q8 T
: [- i2 O$ {- o" j基于另一个起点,创建新分支
( ^) y2 A5 j6 I5 w9 f你可以从版本库中的任何一个版本开始创建新分支。这个起始点可以用一条已有的分支名称、一个提交名称,或者一个标签名称来表达。& m; q. F2 C" l
prompt> git branch
( R0 e8 }4 K# H% ?7 K5 m
* N5 _" C) r% x$ s" s- f' [# O创建同名新分支,覆盖已有分支+ F" _7 j& q) c2 y, q. J
prompt> git branch -f []2 ]& G, s* X' K: S2 p/ v" [
5 k% q' b/ P7 p& M
移动或重命名分支) ~8 r/ a; D, \
只有当<new branch>不存在时
8 D# F) K: L X6 k$ r& m: |prompt> git checkout -m 6 z$ v# p) m) G; a3 X+ c5 V5 _# r
5 ^" l! |+ v0 J5 i) o
如果<new branch>已存在,就覆盖它
7 ^. U4 ^6 z4 j2 F$ kprompt> git checkout -M 0 q# G5 S; W! T1 u' Y2 \+ C
+ \" S1 r8 t* }把另一条分支合并到当前分支' {4 e5 R+ Q: D& r
prompt> git merge
- H9 V9 w/ i/ @# P& s+ N: {1 O) S" n3 q/ D8 A& O0 B) E
合并,但不提交
& M) c, M+ Z! Nprompt> git merge --no-commit
4 a( u# v% ^$ ?0 a, i" n. m! k: J, c* J8 ^: y4 I- S# H
拣选合并,并且提交
' C- B( L, s: hprompt> git cherry-pick * J* E, i- l, F
Y, P0 Y( A* [% u# ]6 d; ?
拣选合并,但不提交* p7 l0 I3 C; ^0 R4 y i& L" B# j
prompt> git cherry-pick -n : \! ^) d2 b$ A+ ~1 s2 d9 ?. a1 }
4 J$ K; T. {* v, d
把一条分支上的内容压合到另一条分支(上的一个提交)" ]% u- ?) G0 @, y. N9 d0 R* M
prompt> git merge --squash . W8 L: r" s0 _# {3 |# D6 U
+ Y4 I1 A1 y4 s b. p7 }$ C) H
删除分支# h4 ~0 N, `* \ ~3 B% O7 x1 O
仅当欲删除的分支已合并到当前分支时
; _" w- |0 B& N" c: F) |- Vprompt> git branch -d , d$ P9 x8 |3 W9 i' M0 g
) T6 D E8 @$ |* I# j+ i C* B8 k, l不论欲删除的分支是否已合并到当前分支
/ u* N4 y5 \3 j$ l, l4 {prompt> git branch -D " Y* y/ ^/ w; `* w* x+ U% H
0 v0 L# q4 i5 ^8 F2 f
5 r8 }4 v0 f: d
" @. }# x( N# E: R/ u% sA.4 历史
2 \7 Y0 T3 [+ P% a: qHistory
" y5 B& v( F/ D- B# e2 n" F; D$ w- ~+ Q3 Q! u/ p& {* ?% B
这些命令用来显示版本库的历史信息,包括代码曾在哪里、谁在何时做了什么、修改的内容及其统计信息。详见第6章“查询Git历史记录”(第71页)。
( o6 M& M; b2 t1 M+ i+ K6 E! B
& }8 U/ F3 j4 b; G- W7 S$ ]显示全部历史记录
/ S4 d5 r% N) ~- T; {, K+ \+ k$ Rprompt> git log' B1 F1 n( a$ g' E9 }: v
) Z \: h' t" L1 y4 | U显示版本历史,以及版本间的内容差异- T3 m4 |" R9 F
prompt> git log -p1 b6 N0 O0 L/ a* i4 x
- `) Z$ H5 M6 k9 x2 O
只显示最近一个提交
$ i0 T, n4 ?! w4 c0 `" Aprompt> git log -1+ J5 Z6 X5 v& p; }" v
: d- T. E0 y/ ?8 l& e6 Z显示最近的20个提交,以及版本间的内容差异; D' S4 l# B4 d) Y* D7 q3 K* X
prompt> git log -20 -p, s% z. x* G2 l" D# g0 v
+ o, p( R' s: D2 K, _显示最近6小时的提交
) u7 E8 R" a# K- W+ H9 v0 hprompt> git log --since="6 hours"
* {4 e1 T) B& ?
4 g. ^5 ~( @3 A/ z显示两天之前的提交
! M9 X* E0 f6 R2 K) p) N; l. B# h1 Oprompt> git log --before="2 days"
+ t$ Z3 X ~3 b6 {7 I6 @
. v5 N* U0 p: g" o- C. |# ^显示比HEAD(当前检出分支的末梢)早3个提交的那个提交8 i( G2 E1 X7 z% h
prompt> git log -1 HEAD~3
' [- B$ U& ^' ~或者……
* b3 l8 Y- F6 Q% |7 Zprompt> git log -1 HEAD^^^
) d1 J6 U0 f5 c或者……+ y6 X! i% I! [" `0 X9 z
prompt> git log -1 HEAD~1^^ h6 c$ ~/ _! d7 j% l- X$ @" y
# j5 J) D x' [6 @& I显示两个版本之间的提交% w1 _$ h4 J& `2 Y
下面命令中的和可以是一个提交名称、分支名称、标签名称,或者它们的混合。
, ^: m. ?2 g$ u, [0 ^% m" aprompt> git log ...
( p" B+ R, @6 _0 A6 Z+ _
: e7 `4 Q- z" T& F$ v" Y: k显示历史,每个提交显示一行,包括提交注释的第一行" f+ e0 H: T$ T4 ~8 Y1 T
prompt> git log --pretty=oneline+ ~% H* T$ q, R9 t
# d$ Q5 q C" ]# E
显示改动行数统计) {6 w1 c2 ?% }" j4 ~! t
prompt> git log --stat' ~& H9 M2 }) Q' m6 e+ p
3 i) f0 N8 G( @- ~/ H显示改动文件的名称和状态
1 G$ n& L7 R+ g; X. Lprompt> git log --name-status
3 c4 D* y, Q: z* v( x E9 g/ G
0 s- {( w" G7 N/ a1 \* T/ a显示当前工作目录树和暂存区间的差别
" ~' c# Y( k1 Z3 `' ^prompt> git diff
9 o0 t5 M3 o# N$ g5 Y
0 i& h' M5 V) [; R% N- n X6 S$ L显示暂存区和版本库间的差别& G3 R# I s" Y% f
prompt> git diff --cached( T; X9 E" d. x% r/ `
! x' e- e+ A2 ?4 x显示工作目录树和版本库间的差别# G& }+ j% v1 n/ z6 G1 F; U
prompt> git diff HEAD! t: s; U) i" b5 P: j* F
8 l; w' _! w% j A1 S3 q9 B. F
显示工作目录树与版本库中某次提交版本之间的差别) i6 ^9 W% u& p" [2 j
可以是一个提交名称、分支名称或标签名称。- E, B* v' {- ]: d8 {0 S
prompt> git diff
2 d/ l* e6 H1 j) s& u1 N* ]* b! W- r; V
显示版本库中两个版本之间的差别$ K" M8 r. \9 {( A
prompt> git diff
. G; u$ e D/ O' L1 s! m+ I2 L" M$ ~' C. A" ], T
显示差别的相关统计4 F% X( z) e, l5 ~! b4 {4 v
prompt> git diff --stat []# U9 D* C! I) I) e' v
9 L( b1 X. I5 ]1 @9 Y. k+ u5 K; x显示文件中各个部分的修改者及相关提交信息
: M+ C: s' U w7 W# [8 ] l: I7 fprompt> git blame ( T( J5 H7 ?( x' d+ R
/ L, `2 {, c+ u# [/ n- N7 Q
显示文件中各个部分的修改者及相关提交信息,包括在该文件中复制、粘贴和移动内容等方面的情况。. _6 s, J7 Y; M8 |9 L
prompt> git blame -M $ r! J, b% ^- K+ q! |/ n& k
]: q9 J5 c3 B+ F$ ]显示文件中各部分的修改者及相关提交信息,包括在文件间移动内容方面的情况/ Z$ x- [$ m1 Q7 o$ T( Q
prompt> git blame -C -C ( u& H- L2 ?8 B* r
# k7 \6 o, t' C u7 t6 k+ t显示历史时,显示复制和粘贴信息
4 t3 {1 A W+ X# Oprompt> git log -C -C -p -1 1 U; f' |( P4 V7 n7 _# Y: [
1 _2 z( x' G6 s
. t3 ?/ l* e5 O( p6 w2 @" c7 Z' J7 G# K( k8 g3 i; M3 A- _( i5 R
A.5 远程版本库
- M3 l" ~2 W7 b! ^6 pRemote Repositories
; T; K: Z3 M: N( x7 F, ?" w# v) S* v* h+ M* H
开发人员之间通过远程版本库来共享工作成果,相互协作。本节介绍关于这些操作的命令,详见第7章“与远程版本库协作”(第91页)。
h; q; l1 R; Y Y. o; z0 p( T7 u
" e+ V; }; u8 h克隆远程版本库# I' e% f) n$ m4 ~% L4 q) I- I8 o
prompt> git clone # B4 I4 `: `' h6 o9 e/ W
% {$ b, |' g c( C8 v
克隆远程版本库,但只下载其中最近200个提交的历史记录
& g4 v# Q6 n! K, qprompt> git clone --depth 200
7 i! g$ M4 ?3 \3 _1 V2 E3 B- V* }* P' U. Q3 J( p3 I: K0 h
在本地版本库中设置远程版本库的别名
* R: k* T, R9 U' n; D& }0 C$ fprompt> git remote add
" |! o/ g& S; A' ?3 z& `- g* Q/ s. q7 g) y4 }
显示远程分支
+ b6 E+ X/ }6 ]6 yprompt> git branch -r5 E* D% a! K5 `- I' ^& V& y
) b1 {* D9 ]+ g3 R/ [
基于远程分支创建本地分支
# h: O: C; J: xprompt> git branch ' `# |3 t5 i9 g+ {/ d8 I
1 E# a1 J9 F0 m- w
基于远程标签创建本地分支
, J6 ^( p$ |5 ]" T9 C! bprompt> git branch + L$ P2 J+ O9 ?' V) D) o' g
4 Y! A6 ]" M# n& `
从别名为“origin”的远程版本库中取来修改变化,但不合并到本地分支! e) k- ?6 B& [: n
prompt> git fetch
0 _; m% }( j7 g3 l2 a' T6 l
) q9 Z! j6 Y! ~, i. {+ Q1 L. n从任意的远程版本库中取来修改变化,但不合并到本地分支, F9 [# N( ~3 z R1 {9 a; Q1 b
prompt> git fetch
: i* O5 k- i! r5 G6 A4 N- Y
8 @* C5 Q0 v& L6 v从任意的远程版本库中取来修改变化,并合并到当前检出的本地分支- _/ S3 u: t: L5 a: a2 e& L! P
prompt> git pull ! D( o5 G6 ~* @- I/ j7 \9 n
+ T2 A ]/ _; z( b
从别名为“origin”的远程版本库中取来修改变化,并合并到当前检出的本地分支
: s+ Q8 J& `, P# ^9 {& }6 `2 F( Nprompt> git pull4 h' u9 a9 E( m1 x
: T, |9 N. J0 s3 C5 c- Y8 I7 ^0 [
把修改变化从本地分支推入远程版本库' a( E/ L9 s5 r
prompt> git push :7 `7 a5 s" }+ \) |) g! Y
9 J. i, ?) z: ?( t0 B/ e0 E1 T" P! s把修改变化从本地分支推入远程版本库中同名分支
w! X& t$ m+ p/ Yprompt> git push : Z7 ^, h/ w" V/ {. j9 s& }
% i6 |, H$ k3 L! p {把修改变化从本地新建分支推入远程版本库
2 x! W8 Z/ {1 t+ u" P6 y. _prompt> git push
( a0 w4 f0 L+ q. m! F/ b8 p9 _ J1 ?5 Z0 w
把修改变化推入别名为“origin”的远程版本库
; [ F: _* Q3 R; E. G当远程版本库中已有同名分支时,这个命令会推入本地分支到远程版本库对应的分支中。如果远程版本库中尚无同名分支,则须使用git push 。; r+ G4 S. K5 b) M1 A
prompt> git push
, `: l5 V8 `) _0 C1 d6 i6 }0 V& T3 E# v+ r6 H2 y' M
在远程版本库中删除分支" y8 T& @- h& U5 L8 H: @; X
prompt> git push :
3 x: k M7 m% @) \5 R# b
7 h" i4 F0 |" \% p: P7 z# `% \在本地版本库中删除所有远程版本库中已不存在的分支1 \, H: X& L8 A) |+ L, O
prompt> git remote prune : {1 |) C) U$ X$ l7 O& C# G- d
1 e6 w1 C6 h E6 ?: T
在本地版本库中删除某个远程版本库的简称,以及该远程版本库相关的分支
* o' o2 X0 o" u2 Jprompt> git remote rm
+ Q. r' }" c: b# G. M- h" n* O! L* t" c J- g& Q) `' [: {0 p* j
A.6 连接Git和SVN0 q( o# v% E8 E! ^" N/ W, H1 |: [
Git to SVN Bridge g& s) D) O* _9 Z, [4 e
/ U$ B4 a" E3 S4 OGit可以读取Subversion版本库中的数据,并把本地修改发送回Subversion版本库。这是Git区别于其他版本控制工具的必杀技之一。相关详细介绍请参见第10章“迁移到Git”(第131页)。6 q) H) _/ t$ i$ s6 ]9 y
克隆SVN版本库的全部内容
) K" [! x( C7 E; W8 u$ u! @prompt> git svn clone ( O8 h3 @ T' g7 E' ]' N
X2 m- s; ?5 o; @1 ~/ w
克隆具有标准结构的SVN版本库6 {/ r( s* Z Z, f1 c/ R
下面命令适用于克隆标准结构的SVN数据库,也就是说,主干命名为trunk,其他分支都存放于branches目录下,标签都存放于tags目录下。$ r# W- R" s! v5 ^9 S
prompt> git svn clone -s - R# E9 q& I, [
+ o+ b% r3 \% I$ ^克隆非标准结构的SVN版本库
; d0 ` F+ w: t: i/ p8 @prompt> git svn clone -T \6 M, _5 s2 B9 j. _; x5 \" h
) I3 @4 }1 h: i; R# K
-b \
1 W7 y8 q* ^ Z& L( T* c2 x' E! k( p+ m9 g9 [1 K) Y8 Q5 r' |
-t \& C, M* @# F+ l* R7 z3 `
' K4 r, i* b% \3 R
S! e0 \! l4 p" H8 ~5 g# o# G; h8 m* V1 v+ J, n
克隆具有标准结构的SVN版本库中的某个版本(比如第2321版)
% v; e" N7 A; ]& u" wprompt> git svn clone -s -r 2321
3 G, N4 u8 R/ {1 J$ {2 G
# h3 t( w" k% `+ p% f. [. b8 g" Q克隆具有标准结构的SVN版本库,并对SVN中的分支添加前缀
0 T7 _8 \; O. M& R( B. ]2 B lprompt> git svn clone -s --prefix svn/
! z4 q8 g P3 q9 x; i+ a( p O1 _$ L9 ]; u
从上游SVN版本库中获得更新的内容,并依此在本地Git版本库中变基本地分支
0 ?6 l3 P w" _8 C& jprompt> git svn rebase* ]/ K- y/ x2 ]3 @6 H% D
* b! a5 s8 z M; Y' m/ W; _* [8 k7 f
把修改变化推回上游SVN版本库
3 q- S F( x& y2 Q4 tprompt> git svn dcommit
+ o' O/ L6 T& g( e, J4 E6 `0 G0 k/ o# V. c( M( N8 d9 \
列出所有将推入上游SVN版本库的提交
$ X; Q x3 S( Gprompt> git svn dcommit -n
; a, M0 h( r5 E0 d7 Z! b3 z5 }1 P+ M$ f# s' ^
显示SVN历史记录) u. p+ v" w0 s3 F
prompt> git svn log* y2 A% ~( P7 ?8 M
' y) K5 c, x1 E g* l$ F7 w
显示文件中各个部分的SVN的修改者及相关提交信息, n( E% Y+ A5 k. t, v+ u, ^
prompt> git svn blame
阅读(1045) | 评论(0) | 转发(0) |