|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GIT 的常规操作
% x c0 U% _: S3 _5 x6 z( h# Q# r1 w常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中
( p1 q/ A# G i7 k7 Z; W
( i) ^" ]) @! ?$ egit 配置文件
, Q' {% S: A0 ?4 e' D. `% sgit的配置文件位置 S4 A: O4 e- u
针对所有用户:/etc/gitconfig1 d6 i% l M) _( }, p
针对当前用户: ~/.gitconfig
. g" o( }6 R( @" I; [% T# e! y
8 s" K. S, ^2 ?查看配置的方法8 x2 M! L3 c8 z
. i0 e! k9 J* d* `" \. D# h. I
git config --list; I/ a, Z1 n7 U* Y8 @
修改配置的方法
7 r1 S- L6 L# Z& e1 L
! C4 j! I7 i: k. Y+ a5 H/ P- sgit config --global user.name "wangyubin" (修改的是~/.gitconfig)
! q! b& F4 g. Y% s6 cgit config --system user.name "wangyubin" (修改的是/etc/gitconfig)$ @! G* l2 |4 G8 `$ S. [4 |2 `
git 基本使用4 F- E9 r1 T* `
clone现有仓库% v; y8 v# E$ n1 M
0 c7 Y& m& Y* G; A2 S6 T6 sgit clone URL (URL支持git,ssh,http,https等各种协议)
' s p8 H# H3 a; s3 Hgit中文件的各个状态% a; w' O% W. M
. y2 [1 I4 K! K# n
unstaged - git仓库中没有此文件的相关记录4 j- J9 ]+ F8 _/ |; [6 C1 n
modified - git仓库中有这个文件的记录,并且此文件当前有改动# u" T2 p0 e" o
staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库5 q/ O, X! Q# v3 p1 f6 ? k
commited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)# G% k$ W- n/ m. c3 x- \; ~3 C5 j$ ]
查看git仓库中各文件状态
0 b: p6 G4 ~6 N+ u: p! ^- B( b. { p& `; j! J N
git status
& t5 f h1 E+ C5 r. ^$ S* s! C初始化一个仓库
5 K$ S3 r* Y, P* j1 h2 h p$ E$ p4 O6 W8 Z( O# n2 J
git init
( z [% C, Q5 t+ O( G在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态
5 `/ Y0 d3 [% y3 ?1 p! y5 H1 e, Y! \0 k4 p* J" ?% s
追加文件
- |/ c( Z! R) Q! j: I
( o/ k! W& f; Mgit add test.c
5 o6 N# W5 e, I/ T+ t7 u2 Utest.c的文件变为staged状态,其他文件还是unstaged状态
. V3 b( Q' s1 s k4 N/ F3 O8 P, S0 S& T1 J0 `( W. D
5.1 追加文件的结果1 - 恢复为原先状态(变为unstaged)* j; [* c: `7 L9 V
' A6 y, y6 O9 ]" a7 Ggit rm --cache test.c
- K' Z$ K' [3 ]2 E x5.2 追加文件的结果2 - 提交到git仓库(变为commited)
5 G2 R3 Q8 M0 z/ Y$ y3 ?- H9 j9 P0 o/ j3 _
git commit -m "my message"; K; N! S) {, X k( P
修改文件1 L( c# I7 s. [/ u1 d4 I( m1 ]
, i, Y5 w( t2 Z. d8 F) C) k9 X' iecho "aaa" >> test.c
* h% \3 |( `0 r7 |7 k: _test.c的状态变为modified' A- I( d2 v6 h9 w/ I$ N
! H0 _0 A& k5 P# `9 M X, i
6.1 修改文件的结果1+ N" ^6 h& H F. \. ~2 W; x
% F2 Y) A% C' B( N! R9 W% L2 {git add test.c (暂时保存修改的内容,即变为staged)
d; G" A7 `2 D$ E! Y* i下面有2条路可以选择:
! s" k4 s( _- {( { o7 V5 Y( a6.1.1 取消刚才的暂时保存
$ X- p& s: C: U4 M0 f; f' j8 Q0 x3 e4 F7 q; X* J
git reset test.c (状态变回modified)
- {3 |4 I1 k, [ p- e0 ]6.2.2 将暂存的修改提交到git仓库 g* Z4 f; t$ g9 b0 a
! C: V4 v9 H6 j" |& s2 P
git commit -m "my message"$ _1 C$ `2 \2 }, |( ]) j$ @
6.2 修改文件的结果2
~, }: f: @6 q" r& I% ]( R$ S; q8 ^ D
git checkout test.c (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)2 y% {# |3 x8 m' i
删除文件
. g9 P2 n% n) C& V4 r7.1 从git仓库和磁盘上删除文件 B4 Q, a8 H; ~4 {* [: |) z
. B4 P2 r& H: Y* Z" B3 ^4 A @9 igit rm test.c (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)) b/ x$ J" r8 _+ B/ |; g
7.1.1 从git仓库中删除test.c
( R4 b2 @; W$ G: S5 T5 i4 N
, ] m- L3 E r9 B# y# u1 k6 bgit commit -m "my message" (git仓库以后不再维护test.c)
$ ?! `- k: Z. |3 H( Z3 X4 P7.1.2 删错了,恢复刚才的操作; z W+ U6 O; ^/ ]9 p
0 Q$ ]8 T- i$ t) X* F. pgit reset HEAD test.c (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)( ^/ ? r! y% t& B
7.2 仅从git仓库中删除文件
0 {: W9 V- E$ v8 [1 C9 K5 |
4 j) B0 _; p9 o R x' ]git rm --cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)9 v' R1 `1 I, C- x/ `. U. E6 p" [" q# [
7.2.1 从git仓库中删除test.c9 }% b2 B1 k( N$ ?! J
/ Z* E7 s: r* }( v, ?
git commit -m "my message" (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)- u% \$ T& V- L% f- d
7.2.2 删错了,恢复刚才的操作" O4 W# ?6 A( ]$ {: U( ^
' W5 t `) O- B8 g1 cgit reset HEAD test.c (和7.1.2一样)
7 L( [8 Y. v" Q2 q" C3 o7.3 误删除后的恢复
& M$ @/ h7 a* [' Q* U如果删除了一个文件,并且commit之后发现删错了。也可以恢复,
. h. B6 Y* x, ~( x! E
. }: \) g' h3 {& o- Dgit log (查看各次的提交信息)
2 u# l: \- [1 _1 U! X, bgit checkout commit号 (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了): _3 K- G3 n: C- ?$ r
git checkout master (备份好删除的文件后,再回到最新状态): ^7 b3 |. I% f4 I
git 远程仓库! {- y* U Y0 c1 g
查看远程仓库
5 J( A# @4 X0 z/ u5 F' j" u1.1 简单查看-所有仓库
, b/ O: u0 O J# F [9 L& n4 q# a @0 x$ a/ J7 s
git remote (只能查看远程仓库的名字)
* O0 l! ?/ g/ L4 b# h1 H L1.2 查看更多内容-所有仓库" R- M. w6 s) r/ g; p
; T6 t: W+ {2 O J! lgit remote -v (远程仓库的名字及git地址)- v8 a& w' b& ^2 ^1 G5 s0 r
1.3 查看单个仓库的信息% k) V0 e" w( I1 E
$ [3 d5 C& d, Q
git remote show [remote-name]6 V$ v, G8 V2 q. J; b
新建远程仓库8 H/ Y; U' o4 I9 v% w% ?# j
: ~+ T+ ^+ t n/ fgit remote add [shortname] [url]
8 {' D U" J2 ?. w" v3 ^8 t) d% hex. git remote add mc git://www.host.com/gitdir/mycode.git
( Q N' i$ j( K. l+ J) V/ I修改远程仓库
& F: m0 \7 O( n/ ^: Q" c5 c# y& l! Q. z3 G2 l
git remote rename [oldnanme] [newname]
4 G3 a) p5 r9 V$ O删除远程仓库
8 _/ s- l3 j& p& H" ~4 K# {! n
; B+ a- f. M( L( t rgit remote rm [remote-name]
4 E7 L: j+ m/ X7 e9 ?远程仓库的数据
( g8 L; F- D6 K0 t7 A- Z% A! T5.1 获取数据
3 w8 t' h$ E6 v7 Q, s0 j# _( R4 g
git fetch [remote-name] (获取仓库的所有更新,但是不自动合并当前分支); c- b z2 U2 |
git pull (获取仓库的所有更新, 并且自动合并到当前分支)/ a- }* S& k8 k8 \
5.2 上传数据
4 X" K$ G$ [$ N% _8 @7 @
3 L* p1 D( G. T; ]7 S( O1 E6 S* t: xgit push [remote-name] [branch-name]
) C! W* _, L; d0 ^2 k& I" m, Fex. git push origin master
% w1 x6 s/ G. Igit 标签
$ }+ ~) ?4 w/ r' G6 Y2 E' K列出标签
$ M0 N& H, b. E& N+ u! o1.1 查看所有tag
# M5 N( E7 j9 c( b
- u6 U6 F1 T4 E0 \. igit tag; O5 ^" N3 ^3 z
1.2 查看某个tag7 O# G' C2 L% E: t& U8 V
* x1 d7 g& g8 B6 ggit show [tag-name]2 k/ g, Z9 Z( w, { w7 p4 i
新建标签8 o- b' @) R/ K% F
2.1 轻量级tag
5 O% d1 C. N/ u0 A, t' n
- P6 N9 e; U( l! S1 X3 Rgit tag [tag-name]. Q: P( M$ J- n" K2 z3 K5 i
2.2 带标注的tag
8 g. u! I% `. r2 u3 P/ x3 ?2 E6 y& A" w
git tag -a [tag-name] -m "tag message" d [* j/ R1 Z
2.3 后期追加tag
+ @! f+ h7 E; R' X5 b* B, d/ U
& {7 l2 [9 V! y/ |- X- P4 Agit log --pretty=oneline (查看所有的commit号)
d- I& n" O5 m. ]' ?% q* Vgit tag -a [tag-name] [commit号前几位即可]
0 u/ x4 W# z- T7 z ]5 o2 t" w删除标签
' r) ^2 F9 V! i$ f
* F6 E7 I, X2 qgit tag -d [tag-name]
3 T& N- `2 I# l0 W% R提交标签到远程仓库
9 Q; A; k$ n6 {5 I, I! b
1 s4 _3 H; I7 Z1 n. P0 t6 Q$ Fgit push [remote-name] --tags
) G! f- [. y, j, k$ fex. git push origin --tags
$ S! ^' Z( _7 q! h1 R: R9 _0 t0 jgit 分支, i) S: Q* z, K) x) q2 l7 l$ U9 y
查看和切换分支
& @0 `* q1 \0 } K( {
' C3 b2 v7 d; a( ogit branch (查看所有的分支及当前处于哪个分支)" Y2 Q/ p1 E+ ~+ s
git branch -v (查看所有的分支的详细信息)
1 I3 w& ^* w( _( R! B1 t2 H9 igit branch --merged (查看已经合并的分支)9 G! @5 L# p5 b! F s. I: k
git branch --no-merged (查看还没合并的分支)
9 h# S/ g9 V+ d% ^ Qgit checkout [branch-name] (切换到某个分支)2 y, K9 I$ ^' `; X9 {5 ~3 u
新建分支
' k5 [: p; L: |- W+ w6 p
$ A0 s& l! W0 N- M8 U( Ygit branch [branch-name] (新建一个分支)
9 A- c6 N3 ^% t0 B) pgit branch -b [branch-name] (新建一个分支并切换到这个分支上)9 f1 @0 K- n2 B$ m% f6 |; M' _3 A
合并分支
9 v/ [) H9 |3 S/ p; `' I
2 t# W( H' _* W9 Z6 _) l' kgit merge [branch-name]
7 \5 `# Q2 e* `4 Sex. 将分支btest合并到主分支master
^! d( V: e+ f; Pgit checkout master- L& m) n5 C) w' w. }
git merge btest) e0 Z+ V2 u9 i
merge时有冲突的文件会列出来,需要手动合并
) a% o# A! x# Z% \
- S/ n1 ?2 q6 H" x将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
) ^+ E* E* O5 \. h如果没有冲突的文件,就可以 git commit 来提交这次合并了。
7 Y6 i6 t( f k8 z6 L, W X2 q) Y: G S) b4 c# d
删除分支
u; V* M( }2 I! F7 r% V1 {+ d) H3 S* X) b5 i& t
git branch -d [branch-name]8 c% a; K3 u' B' { M/ k
或者 git branch -D [branch-name] (强制删除某个还未合并的分支)5 f7 @) s9 {5 L) [+ x& f$ b
远程分支相关
/ I, Z% L& [& w$ t2 _5 G! e5.1 新建远程分支9 W: h- |+ }- x1 e' w
7 v: J+ f: {) J5 x: p0 ~git checkout [local_branch] (首先进入想要上传的分支)
! s* x7 ^! M9 A% v2 \git remote add [remote_repo] [remote_branch]- V. m% R1 A& w0 q/ I' U, |4 w
(这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,, N/ e3 o) z8 i; G0 W' @7 `9 v
[remote_repo]是远程仓库的名字); f2 S, r+ u& V1 t
5.2 向远程分支推送数据9 h+ ~3 u& g6 O' ~( _3 l
4 s7 `- y; g2 ~( Y4 ?+ L9 Y; q$ K
git push [remote_repo] [remote_branch]0 k# ] ]0 w' V4 ]9 D- ~0 N
5.3 删除远程分支+ z }' n! B, i1 H7 |% }1 Y
9 \: _( v2 x- M/ sgit push [remote_repo] :[remote_branch] (注意远程分支前有个":")- ^2 f( J0 W0 t" c
合并分支的另一个方法:衍和
, I, T! |) W! c
: c8 b& A R4 V! o& ]% i衍和可以简化master上的提交记录,使得代码可以方便的回退,6 V' `: O9 o6 P6 y
但是在公共仓库上用衍和有一定的风险。
! j1 r0 P \) a4 t* X衍和我基本用不上,这里就不赘述了。
& W$ ~+ l2 a0 z+ F! F, Z
* {5 E9 F$ o# z0 I服务器创建 git 仓库, 并将其作为远程仓库- c/ I, B/ K) H. H! ~+ |
其实 git 是分布式的 SCM. 并不存在谁是服务器, 谁是客户端的问题, 这里所说的服务器上的git仓库, 指的是多人合作开发时, 共用的, 作为最终发布版本的 git 仓库.3 J* N/ I Z8 A; Y$ W7 f9 V
这个 git 仓库就相当于你在 github 上建的仓库, 会将你在各个电脑上做的代码等提交到上面进行统一管理.
8 H: ^" w9 C$ X2 _# S$ Z3 o7 R, x% p c" }! Y
服务端 (远程 git 仓库), ?) O0 ~& N$ X
生成用于git服务的账户 (一般就用git)) ^3 @7 e' y/ Z& k( q+ K9 i, \
$ q8 F2 h+ }! g8 S/ c$ d! f$ egroupadd gpxxx
7 Z2 J; C6 k$ v) N+ d8 Q+ k; D- buseradd -m -g gpxxx gitxxx1 J& I) a3 t' x
初始化服务端的git 仓库
9 q) {! \8 T0 x' R
$ I! _6 F7 P! d0 U! n8 d% [6 N! ~cd ~/2 R+ d& s# i' r1 R8 `
mkdir git-repo7 S( O+ ~' H+ u. F
cd git-repo( `0 ?2 p K& M4 z8 K3 x
mkdir test.git. m( ~. O+ n* F8 E3 H5 X
cd test.git3 w1 @: u' y+ G, c" Q
git --bare init
/ x8 S, D; ?5 N/ v客户端 (本地 git 仓库)
; B U7 P2 e4 I/ S3 e新建本地git 仓库
) M; E# X: c) {4 V% ^$ ?
4 w$ `" F$ A3 S7 z) Scd ~/gitlocal6 R1 D" s6 q8 G. @3 L+ a
mkdir test- S- |' {, k, p
cd test" H* C6 f t+ e. G/ C5 A
git init
- H3 s7 \8 Z, d初始化本地仓库
! u4 S! D' @4 F4 H* @/ `8 ]1 r, L, B6 H7 z2 V6 b0 n
touch README1 u5 @7 x/ q V- n! \. h* B. D) x- z
git add README
, E4 q$ J/ N7 z( Rgit commit -m 'first commit for init'. z5 d9 r! N# Z9 g% ~( b7 j
设置git用户信息
: Z, p; i7 s3 m3 O# f4 ^" F; a* ^/ x: g
git config --global user.name "wangyubin"
) w9 l1 f9 x b& \$ h, L5 cgit config --global user.email "xxx@xxx.com"% |! N; l& o& ?4 G( k
关联远程仓库
. o7 V+ y m& K
0 Y/ v4 r5 u. i3 X1 p" x' ?git remote add origin gituser@<server address>:~/test.git/
! e y3 v% q5 Q2 L3 {将本地仓库提交到远程3 k! l# ?0 y7 E/ u% b+ D. N
& p: q7 Z( X: P6 G3 E
git push origin master- L# H e; j% c
git 使用中遇到的一些问题3 q1 M& K) X0 }4 ?: K( {/ _+ a
git pull 时, 远程文件与本地文件有冲突
" `% S% C2 }6 x6 g; L7 Y如果远程的仓库被其他人更新了, 并且更新的内容与我自己本地编辑的内容有冲突. 这时执行 git pull 可能有如下message:
( v! ]* P d! A# i7 j3 D0 X$ K2 w7 r0 t( D _4 V, d7 X+ f% X
Auto-merging path/to/conflict-file
1 \ T! Q U# _3 m, @CONFLICT (content): Merge conflict in path/to/conflict-file
9 q' g! \% F! NAutomatic merge failed; fix conflicts and then commit the result.# c4 q6 S3 b- J# ^/ m) P
用文本编辑器 vim 或者 emacs 之类的来编辑冲突的文件 path/to/conflict-file, 冲突的地方有类似如下的显示
5 S# x' C5 \ G1 ~4 ]% x; B) i9 m3 v4 A5 C* n1 n8 K: a
<<<<<<< HEAD
: S9 H- E& k: | App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))( e2 } j- c0 R E2 q0 F8 I o
file = request.FILES.get('file-xxx')
1 O, E6 e4 G c2 F8 n) G: I App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
c1 M2 B9 ~" N) x1 L7 Y$ U* q: I$ z. `2 a$ @0 L
=======
3 A: h; i5 H1 c! C file = request.FILES.get('xxxx') B h* {( g- t4 j/ |8 I+ W4 ?
>>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5
$ W% a- L3 L$ u( @6 y7 J0 n; I===== 之上的 <<<<<<< HEAD 是本地的内容
( { H8 l& u& w1 X- v6 D5 B' H===== 之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是远程的内容(这个commit号每次都会不同)
; s, }" t8 B8 a' @+ C% M根据实际情况, 删除多余的内容(包括===== >>>>> <<<<<< 之类的), 修改冲突的地方, 如果以本地的代码为准的话, 会得到如下结果:; ?# k1 ?, q+ q. Z) V' Y
" G, U4 i9 D7 I$ H* h
App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))7 u" B8 I, ?, p/ }
file = request.FILES.get('file-xxx')! m! U) V! F; A: K8 ]
App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))9 l% Q4 }1 P) ~4 O/ n6 p
然后 git commit -am '提交的信息' 就解决了冲突.
5 f6 ^! `0 {# h: Y+ s9 W最后, 也可以将本地的修改同步到远程 git 仓库: git push9 h1 A' c2 \" q/ z/ ?% s
B' l2 t% e* \$ v, P1 @4 rgit pull 时, 本地还有未commit 的文件
: O; C( q, q$ |3 F/ ]: t2 S从远程仓库更新时, 假使本地还有没commit的文件A, 远程仓库的A文件却被修改了. 此时进行 git pull 时有如下信息:2 ?8 V% U# U0 F/ a5 m
9 k6 ]8 f" X0 I5 n9 [0 }4 v; S
6a707cc..f93575d master -> origin/master
* b5 w4 H; s4 }. S; z" jUpdating 6a707cc..f93575d% c! f9 P% t" Y! U' l E
error: Your local changes to the following files would be overwritten by merge:4 k) A9 q9 [0 Q+ l) ^
apps/myapp/utils.py5 B$ p- X; @( t; O$ O% ~ X
Please, commit your changes or stash them before you can merge.
# F! ?4 t% a8 dAborting' N5 E' D+ n0 J: Y6 q
此时, 如果不想将本地文件commit(可能只是临时的修改), 但是又像将远程的仓库更新下来, 可以这样:
1 H3 s" U/ z6 \, Y+ N! ]: |( G6 T% l6 \( _1 y
$ git stash # 先将自己的改变保存起来
* S: u t# H& _' G. @+ }. ?7 fSaved working directory and index state WIP on master: 6a707cc ...
8 d) j* T2 Z$ d8 V( |' dHEAD is now at 6a707cc ..." t9 z& {9 ^1 E3 v
$ git pull # 从远程仓库更新# B: G; Y4 V4 @, J) q" v; p
Updating 6a707cc..f93575d3 |# P1 N& B0 U! O6 R! h
... ...
1 g1 a( n& M# G$ C' A) t$ git stash pop # 将自己的修改合并到更新后的代码中! ~$ }; a9 u' j- s% h: ^
最后一步如果有冲突, 再参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.( y7 x h, j: _5 b @) P3 R
: W1 p& d9 w. i4 V' ^5 mgit 分支合并时的冲突
5 q" F3 {# ]3 @( u( t% G正在开发的分支和主分支的编辑了同一个文件时, 在主分支上进行 merge 的时候可能会产生冲突.
+ M" |4 {7 I+ \1 }. x以下构造一个冲突的示例:
& H% T$ f& v$ h
5 U. ?& }. X: |% o9 C$ ~" H$ git branch test # 创建一个分支 test, 但是没有进入test分支, 此时还在 master 分支上., T. \4 U% \8 _' d" q
$ vim xxxx # 编辑 master 分支上的一个已有的文件$ Q$ ` B% `9 \) A& H8 T# W
$ git commit -am 'xxx message' # 提交 master 分支的修改
0 O9 a/ Y: D8 b- a4 t$ git checkout test # 切换到 test 分支
; J% v! n* j3 w, `5 C$ vim xxxx # 编辑之前在 master 上编辑的文件, 可以编辑同一个地方, 造成冲突
' Y& y* R! w' o1 p1 ^" ?$ git commit -am 'xxx message' # 提交 test 分支的修改& `9 C- O5 A$ h0 w9 X! n, ^
$ git checkout master # 切换到 master 分支, j( |# n4 L2 ?7 w" j; P# p! Y6 K8 d
$ git merge test # 将 test 分支合并到 master 分支, 由于上面编辑了同一文件, 这里会产生冲突
' A2 J0 [4 w3 U4 EAuto-merging xxxx" ?6 a7 T' Q6 A9 M
CONFLICT (content): Merge conflict in xxxx
" R) M8 W8 E: F5 I \9 IAutomatic merge failed; fix conflicts and then commit the result.+ q1 E; L2 u0 g' @) T& u/ L
最后, 参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.
/ t( O+ y" t# ~- ~6 x# P' G
' c( D! e5 P( b4 u通过 git 提取补丁
( F, }9 I$ c( c提取的补丁的方法有多种:1 z" j. `9 O$ o Q+ Z
O/ ^ V- w" w7 v: _
$ git format-patch -1 # 提取本次 commit 和上次 commit 之间的不同, 并生成patch文件7 s" ~/ b, B$ x
$ git format-patch -2 # 提取本次 commit 和 上上次 commit 之间的不同, 并生成patch文件( P6 S5 h$ q) |& D
$ git format-patch commit号1 commit号2 # 提取2次commit号之间的不同, 并生成patch文件 (commit号可以通过 git log 来查看)4 F( [: l# q' R" L
$ git format-patch tag1 tag2 # 提取2次tag之间的不同, 并生成patch文件 (tag可以通过 git tag 来查看)
; {7 T$ X6 J' ~" S通过 git 提取指定版本的源码
3 K1 J, A7 T) j( A8 N# e这个功能在部署的时候比较有用.
' A5 O8 j2 f! ^ m4 p" g& x7 |
4 P2 q# ?4 o. m2 [& u$ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar # 获取 tagxx 的源码, 加了 --prefix 的作用是在最终的 tagxx.tar 中加了一层文件夹 tagxx
0 G) y8 }( F. O3 _8 g上面的 tagxx 也可以是 commit号 |
|