|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GIT 的常规操作2 @; }' n+ F) s: q/ X* p
常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中
. _9 f' a4 t- \2 C6 K6 u1 T: C" b2 c+ O5 O
git 配置文件$ X _7 z/ j' @+ v* `! ?
git的配置文件位置+ X# p$ m, U! n+ j2 K
针对所有用户:/etc/gitconfig8 G) h5 x7 {( h1 s( g
针对当前用户: ~/.gitconfig
4 q% i. P. o# O, G: r6 L6 e" a( d$ A5 q" W( \; a
查看配置的方法' B% F+ R I; ^- }! I2 z& Q
; S; H) H& {7 B' Y
git config --list9 E- u8 t2 `1 n5 }* L4 c" O; m
修改配置的方法
$ c4 f3 l6 v7 f% {. M* V
- Q5 p8 }1 L6 F2 d! Zgit config --global user.name "wangyubin" (修改的是~/.gitconfig)
3 J1 h4 e( A# ^. q2 S! bgit config --system user.name "wangyubin" (修改的是/etc/gitconfig)1 ~+ P: w% ?2 P8 \
git 基本使用' n8 Q) N0 w" u
clone现有仓库( D. c: E# D9 L& W& F
; [ a! u( t# jgit clone URL (URL支持git,ssh,http,https等各种协议)2 I6 s7 M, r! @, y) r5 O
git中文件的各个状态
( r( v. O, [3 n$ a& K) M" Y: V# }/ W, Z, y% u9 h' G
unstaged - git仓库中没有此文件的相关记录
( J# A) d' b6 K g( f' }2 Vmodified - git仓库中有这个文件的记录,并且此文件当前有改动7 e; h# `5 t8 d1 F' B) Q+ V
staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库
3 R. ^5 c6 ^+ O; Z' N- c' k2 ycommited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)
+ P, ]) x1 I2 m7 f/ W W, Y% ]& p查看git仓库中各文件状态
1 b! ]& S' o5 b6 d# o' B6 h( s: k6 @2 t4 s( H7 I( V
git status
0 e N2 n, z5 i% y% e" ]+ A" H, x& D初始化一个仓库* v1 V; t. L9 ^% f1 Z
+ ~" l' X3 c3 ^6 i% `. q
git init0 J; f0 w; X2 ?0 j, B
在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态
! a1 R1 @2 V! t8 U# l# Y* W$ Y: S7 t( X4 Z
追加文件
# |7 s: G' [( V1 [ a% p/ i; a7 n0 S
git add test.c
7 c, O6 I, M# k1 [test.c的文件变为staged状态,其他文件还是unstaged状态
/ r k8 h, b/ [, E0 j7 A; `! |8 _; l* H
5.1 追加文件的结果1 - 恢复为原先状态(变为unstaged). ]5 r: a4 c5 D) \2 r5 K
" ~, e0 w3 Y. e1 Z
git rm --cache test.c/ x9 v* y( ]0 r5 M% D! h2 p- c
5.2 追加文件的结果2 - 提交到git仓库(变为commited)
8 W* d% k& p( d
N' k, J" U$ ~& T, ^git commit -m "my message"
+ B- _* X( K6 }! E修改文件- Q: G/ M7 r3 _8 c. U
1 s) V! Z/ f' Z" U% ^3 t% f8 b
echo "aaa" >> test.c
@0 ?/ C N7 Z$ u; F. Ptest.c的状态变为modified
6 Z/ ], O$ J6 m- a! T* n/ W$ n) L* Z5 z
6.1 修改文件的结果1
+ ~9 U {& P5 M4 K, e) I/ U p7 K9 E. U) `1 A
git add test.c (暂时保存修改的内容,即变为staged)
$ \1 a) @3 N0 [. @5 E下面有2条路可以选择:
7 v0 @( N' |' x# E6.1.1 取消刚才的暂时保存2 X k9 W, i a5 E* e
% W. W( ^' }$ H5 w: ?0 f) n6 Qgit reset test.c (状态变回modified)
" D, l6 r; G2 S% a' z6.2.2 将暂存的修改提交到git仓库
/ }3 ~- n8 A3 {* x' H" n( c" ?0 Q: V
git commit -m "my message"
; V4 j% Q: m# R1 T6.2 修改文件的结果27 ^9 A5 k% ^; |- q! {9 s
* L E) o" }. Zgit checkout test.c (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)
' b0 T4 G& L6 H% B删除文件5 M4 A0 y! F; y& k5 ?+ _, L
7.1 从git仓库和磁盘上删除文件
/ }+ [2 M0 A1 o. D5 f4 D
# s' A4 k+ a/ } J: Ygit rm test.c (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)
/ m7 a6 ]3 u2 _; X- Z/ s7.1.1 从git仓库中删除test.c: {1 t- q2 x& ~0 H) W& h
& z+ R7 L) N9 l( L: pgit commit -m "my message" (git仓库以后不再维护test.c)2 l. X. X+ I7 R4 F% }$ H
7.1.2 删错了,恢复刚才的操作
/ G* P. l' m+ H9 }* i! e9 N" e7 y% i, Y( h* h# E5 T* G. P
git reset HEAD test.c (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)
: F0 E( t9 r) _5 g% q+ O! Z7.2 仅从git仓库中删除文件
# c3 G4 r& j: r1 i) ?8 |; I# }. U9 f4 k1 Q
git rm --cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)
. W1 _& X$ H, C9 c7.2.1 从git仓库中删除test.c
# L( G7 U2 Y1 t- e* T6 `1 T7 Z
: y! r, b& b: qgit commit -m "my message" (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)$ o& Z6 K* g; N( c' z* `4 B+ \. S
7.2.2 删错了,恢复刚才的操作
) u( p5 ^- l) i- k6 \7 g
" E0 a+ U+ l- M+ Q* Kgit reset HEAD test.c (和7.1.2一样)- Z D% D6 n1 Z# i" H* H2 w" k
7.3 误删除后的恢复' h& f$ O( o$ \2 c! S' ^% z1 w
如果删除了一个文件,并且commit之后发现删错了。也可以恢复,
: I8 r) d3 ]- r @# X3 {$ x* j3 X$ f! ^/ O+ s+ m8 T# d
git log (查看各次的提交信息)2 S( r* T z! S3 _* [5 S
git checkout commit号 (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了)5 ^# E" m( U. ]" `! q
git checkout master (备份好删除的文件后,再回到最新状态)
- i" V* v/ p7 l' i2 q' x4 Q* L1 kgit 远程仓库( S+ j H7 G# l
查看远程仓库
" k0 E5 y& {& ~1.1 简单查看-所有仓库
' }# J! |( U- e9 q$ E6 \/ t' |* z) D9 y; y+ p
git remote (只能查看远程仓库的名字)
6 l* L8 Z5 c, x6 R5 u/ T6 _+ C6 ~1.2 查看更多内容-所有仓库: |: _% R; C( a+ F* R
0 `2 R: M# C7 g' E+ B4 p& _
git remote -v (远程仓库的名字及git地址)
1 L% [0 s Y6 _' u6 W7 [ R9 m1.3 查看单个仓库的信息+ ]/ ]9 J8 E" x0 U2 K2 _8 }1 N
5 j7 Y9 _; K G- r$ Ugit remote show [remote-name]: J' B& v% |1 o
新建远程仓库
9 F) B Q7 P5 F8 T8 u) @. @0 u
; v8 y# e& o1 Agit remote add [shortname] [url]
, i* u {0 k2 b8 q8 tex. git remote add mc git://www.host.com/gitdir/mycode.git( P( \3 p6 T% }, v
修改远程仓库
b; n* N' ]% \7 T1 J" o/ _: K1 [$ [! U
git remote rename [oldnanme] [newname]
. q7 }+ u' b2 k0 _% p2 ?5 p删除远程仓库
8 M. e8 {! \% P* k* q; X( n: _$ Q. Y
git remote rm [remote-name]
& k0 C' k4 n$ ~远程仓库的数据
& ]4 ~' Q/ A. J) C5.1 获取数据
8 ?' E' E) ]! B ]# H$ [3 |/ Z, A" ] @# }) I3 [) V6 ]
git fetch [remote-name] (获取仓库的所有更新,但是不自动合并当前分支)! n" |8 v3 w, e, A. x
git pull (获取仓库的所有更新, 并且自动合并到当前分支)
) J' \. E k b2 |7 `: g& g9 s5.2 上传数据( k8 }# Y8 `# v5 S" k
: d7 a* r- T8 ^! ygit push [remote-name] [branch-name]
; @5 K4 J9 _) D! X+ Z. wex. git push origin master O3 m- b& }. U' M
git 标签( Y0 G: L7 O' Z: E% G: J# N4 j( b
列出标签- E% T# w- a* j
1.1 查看所有tag
4 _; \! ?9 R0 R9 t. X( a- n# Z
: G( D: \, |5 }; p! ~1 t* b/ ]+ Agit tag# ^+ e, L9 F6 s7 d/ v
1.2 查看某个tag
' ?! U- a, N8 ?# G0 _: W, r7 j! b5 F' j! R. n' r: c
git show [tag-name]
! j- @2 D2 z( {新建标签5 ~# V) \% s3 ?
2.1 轻量级tag" L- B( A% M! g, O* w, O
' Z. V2 I' p" `; j# y' ]1 ]- K
git tag [tag-name]0 J3 }: @0 P" ~, _* G% L
2.2 带标注的tag+ U8 z8 N- d$ ?8 K* q! h; ~8 ~
+ P) C; B4 U; V" bgit tag -a [tag-name] -m "tag message"4 z8 p, u0 u0 f, \$ }
2.3 后期追加tag
: G8 r5 L9 {8 ]1 ]3 d2 L7 n" |9 U- i
git log --pretty=oneline (查看所有的commit号)
9 n2 W/ \* u" n' ugit tag -a [tag-name] [commit号前几位即可]
3 S* Y# H6 t( S7 h6 x q删除标签
! d, L1 W2 K9 {4 N- ?, q8 K
+ W# N" }' S7 C0 c4 ?1 ?* ggit tag -d [tag-name]% w* N- F: F% i+ {' w7 j/ i
提交标签到远程仓库$ ^: C6 R; U/ W% q7 e0 l8 `# |
' K& p2 {+ X! r) U; \7 dgit push [remote-name] --tags& I9 @; U5 p+ r4 w a
ex. git push origin --tags
- ]% P8 r1 O6 B7 m2 C! _0 P& Pgit 分支. _ m, b4 w- d+ I* ?2 [6 D+ D7 q# A% t
查看和切换分支5 k2 @) t; P! m5 Q, w
9 H# T/ `' ]: Y5 L# Jgit branch (查看所有的分支及当前处于哪个分支)
! V3 Q! \4 b0 A/ Z# X% Wgit branch -v (查看所有的分支的详细信息)
3 e! S6 g, ?3 S' r0 Jgit branch --merged (查看已经合并的分支)
. k4 l& T( q- @6 f3 P4 Bgit branch --no-merged (查看还没合并的分支)
& b* A9 S" D! o2 R& ~) _9 D @git checkout [branch-name] (切换到某个分支)6 y7 ^1 Y1 ]; R4 q
新建分支
& k# n M* I7 ~: J
0 C2 k( P! d* v4 I9 [( Zgit branch [branch-name] (新建一个分支)# c( ]. x8 X5 d4 C' `# y/ y- F- T
git branch -b [branch-name] (新建一个分支并切换到这个分支上)' W( \6 y- _: r% R
合并分支
$ n) Z" G/ q+ D- T5 l7 g
7 i) K" o5 S/ i- ngit merge [branch-name]- c9 s$ d+ y* o9 z
ex. 将分支btest合并到主分支master4 _- W3 u! y1 ~* }# s6 m5 J
git checkout master$ i+ }6 O. K* w/ L; J' Z
git merge btest
4 I3 m0 x3 ^7 n3 y" xmerge时有冲突的文件会列出来,需要手动合并
& x9 e, J H5 |& s; A5 `
5 E* d V! u, o. @将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
. p0 U) m# e. ~如果没有冲突的文件,就可以 git commit 来提交这次合并了。3 a$ R8 L; A. r3 `3 b3 j! b
2 ^! X/ `$ J- P( j) ?
删除分支$ Y4 E% ]( h, b: g1 E9 X) T% |
" {7 Y% O2 G& z& Y! k9 @
git branch -d [branch-name]4 ~% i" A( o7 B9 P, B
或者 git branch -D [branch-name] (强制删除某个还未合并的分支)5 N. t4 k0 R4 G; n7 i3 H5 s
远程分支相关7 Z1 q* u7 ~1 L: |# G* A; `
5.1 新建远程分支0 ]$ B1 C2 p1 `0 |( v- ~
: b4 s2 s6 n o, Ygit checkout [local_branch] (首先进入想要上传的分支)7 P3 z4 h% [" p, Q) V- w
git remote add [remote_repo] [remote_branch]- D1 D! f) O3 s4 {% X( p, u/ d
(这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,0 M5 J- z" [, G7 J, n$ q* ?
[remote_repo]是远程仓库的名字)- Q) j7 h: |, c" ]; L
5.2 向远程分支推送数据
. a" B4 V2 Z. _% C. q R% q& y$ O9 N5 m G W$ F
git push [remote_repo] [remote_branch]* X) W4 S4 V0 f2 \
5.3 删除远程分支
# d" F M8 p; m6 p9 k# J5 Y0 m2 l1 Z6 D- T x: B
git push [remote_repo] :[remote_branch] (注意远程分支前有个":")
1 a- ^; G3 P' {# Y合并分支的另一个方法:衍和; O3 m, H% r/ |/ m" C2 T/ \
; B6 k5 O' X3 P# o
衍和可以简化master上的提交记录,使得代码可以方便的回退,6 K2 G( K( W5 z M6 O6 ] n
但是在公共仓库上用衍和有一定的风险。8 `8 [0 j, [/ I: T- p
衍和我基本用不上,这里就不赘述了。& S7 K# @: [6 d4 }
! u6 c4 z; v) V4 }( L2 |: O
服务器创建 git 仓库, 并将其作为远程仓库* o: ~" I3 Y, Y
其实 git 是分布式的 SCM. 并不存在谁是服务器, 谁是客户端的问题, 这里所说的服务器上的git仓库, 指的是多人合作开发时, 共用的, 作为最终发布版本的 git 仓库.
/ `9 J3 P) G% N4 }& d8 h1 U这个 git 仓库就相当于你在 github 上建的仓库, 会将你在各个电脑上做的代码等提交到上面进行统一管理.+ x& t4 |0 R& X3 j6 r/ v {
8 R1 [3 l! m: m0 R. p/ r. j
服务端 (远程 git 仓库)$ S" b4 `2 e, O- O! I7 @2 N& Q
生成用于git服务的账户 (一般就用git)' ^! D/ O) r9 ]5 j# K' e- ~3 A
! ]9 e5 ?3 a! _, y% E
groupadd gpxxx
) }6 [+ m% L) N( i# ^5 H% q& V0 F2 buseradd -m -g gpxxx gitxxx
; ]4 Z9 J$ h6 ?3 ^/ w初始化服务端的git 仓库
& _7 ^' b* c2 B8 a& C
- M8 Q6 Q- _: x2 fcd ~/) j$ ]6 p" _$ X2 a7 L1 }4 e7 c7 i/ G# \
mkdir git-repo
. R7 ^* ]. M# h9 |7 m: A5 u/ Ocd git-repo
/ _5 a; d, p( G9 y* Dmkdir test.git
% \0 z3 p- |1 w fcd test.git
8 X$ C2 D' M1 y* N4 P6 wgit --bare init
. T8 b( m* ^; T. ?) `8 r客户端 (本地 git 仓库)
) u0 e$ V% l; X6 C/ e! L新建本地git 仓库
% |# e* U( M" b( a7 }9 w( v/ L
1 }( N5 ?/ L2 g' v. D2 M3 ?cd ~/gitlocal
! P u' e/ ^% rmkdir test9 \+ }: g2 t9 L5 _. A% b
cd test
?( E+ r# M/ k* h* I3 F& mgit init
; ^+ l$ w8 v0 K$ }7 j1 q2 o: C初始化本地仓库' e4 J* { |$ t2 ~
) y: f$ G9 @+ A7 \6 m
touch README. }: y+ r# q V% |) g+ c; o5 M
git add README
! V+ b# [% m4 Y8 Y0 Z- A5 ygit commit -m 'first commit for init'
- C/ \' H( S- J) x! [+ ^设置git用户信息. K. Y3 T+ J$ [. i! d0 ?/ W
: ~, Q4 g, }3 `& [; S$ R: v& ^
git config --global user.name "wangyubin"
8 ~" g7 P9 e" {3 Q1 I0 _" O7 Agit config --global user.email "xxx@xxx.com"
H" u( C3 k! A' i3 v; K4 Q9 y关联远程仓库1 Z+ x( l$ X# o: ?- ]' C0 A0 W
# A6 u$ Z9 b% C+ Z& n ^git remote add origin gituser@<server address>:~/test.git/
/ u) Z! X) J1 L! Y( L* Z将本地仓库提交到远程
6 @# M! J% S# K8 e; w& M m" U
" g* Y9 ]* U! i. i% O/ m; ggit push origin master: x: B4 [+ s( k$ f3 \
git 使用中遇到的一些问题) [% O) c5 B1 d; d+ Q% B& y6 z
git pull 时, 远程文件与本地文件有冲突
' J( E% b. r- L如果远程的仓库被其他人更新了, 并且更新的内容与我自己本地编辑的内容有冲突. 这时执行 git pull 可能有如下message:
7 T. } p1 @% g/ Z
% K' L+ T% q3 N% A0 G& SAuto-merging path/to/conflict-file$ O- v8 ~, B- T0 }! D
CONFLICT (content): Merge conflict in path/to/conflict-file1 S! h8 K g3 u! q) K- p6 Z6 x
Automatic merge failed; fix conflicts and then commit the result.
9 Q* @& Q: f+ D; I F用文本编辑器 vim 或者 emacs 之类的来编辑冲突的文件 path/to/conflict-file, 冲突的地方有类似如下的显示
8 v1 ]' K# w H8 C b
% F) }* ]7 H. p' h; Z: P0 d<<<<<<< HEAD
0 V' h4 V" w* L0 s! e, E9 y App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))/ ]) Y% R0 E2 e! K0 J6 S9 C; c
file = request.FILES.get('file-xxx')
5 {6 H6 @( @) v, d: ? App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
$ G2 J' M2 G. B. j# e0 I& t. p# z; G8 B& e
=======: n" |0 Z) W: n
file = request.FILES.get('xxxx')
# i9 T0 b* ~* R {6 x# O( Z6 A>>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5; q, y" d x1 K
===== 之上的 <<<<<<< HEAD 是本地的内容' ?5 x2 R; Q# b4 f" Q/ y$ C
===== 之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是远程的内容(这个commit号每次都会不同)# s7 @& z7 |' V% V( \/ g
根据实际情况, 删除多余的内容(包括===== >>>>> <<<<<< 之类的), 修改冲突的地方, 如果以本地的代码为准的话, 会得到如下结果:
9 ?, m! a$ Y& U# d Z' h5 J
9 U: _) I* L7 @6 o# X \1 z- gApp_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))2 P/ p& R5 v8 I: B5 R
file = request.FILES.get('file-xxx')* X( v3 n8 K6 a; C
App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
0 _' B1 G1 l2 h v然后 git commit -am '提交的信息' 就解决了冲突.9 r6 r5 G1 `& b3 ]5 n
最后, 也可以将本地的修改同步到远程 git 仓库: git push( S$ r, W5 W& H/ t0 Q- q
2 X, h% J6 z$ D; X4 S' C j% ~git pull 时, 本地还有未commit 的文件- B# v2 J$ N2 x$ ~
从远程仓库更新时, 假使本地还有没commit的文件A, 远程仓库的A文件却被修改了. 此时进行 git pull 时有如下信息: u: ?, |, P* c2 l7 l# l
7 t7 w" X% a. a" w
6a707cc..f93575d master -> origin/master
3 U6 V7 r, Z) K' h/ j) L( [Updating 6a707cc..f93575d
) o- H4 x! M% i0 e: }5 }% U/ Berror: Your local changes to the following files would be overwritten by merge:0 W3 k( J5 m! {1 s; N
apps/myapp/utils.py5 o3 }2 c% {4 ?6 ~/ W) x) F
Please, commit your changes or stash them before you can merge.
1 X7 i% L, u0 g( ^* Z% FAborting
/ Q! ?) \* S( k8 A% w/ }此时, 如果不想将本地文件commit(可能只是临时的修改), 但是又像将远程的仓库更新下来, 可以这样:
* o4 ^ q9 }& l/ i
$ m( H8 `. @) L9 u4 Z5 e: N$ git stash # 先将自己的改变保存起来
" t0 K+ Z R/ `) D) MSaved working directory and index state WIP on master: 6a707cc ...; {! H" t# q; b" k! s% ?
HEAD is now at 6a707cc ...
1 G/ Z( `$ \$ m8 b7 ?$ git pull # 从远程仓库更新4 l2 r7 ~/ Q( |% A$ [ b+ d
Updating 6a707cc..f93575d
& h; o8 h& [$ h3 l) ]. O... ...2 z( t `' l! Q6 B9 a1 @: ?
$ git stash pop # 将自己的修改合并到更新后的代码中
1 n, {& \/ v6 A- w2 M) P最后一步如果有冲突, 再参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.
# x8 V+ i) k I: \$ _5 e* g
) Y; B. q& \5 W* h+ Q- K9 }git 分支合并时的冲突# M$ W& R$ e& F# e, z& R+ U) B
正在开发的分支和主分支的编辑了同一个文件时, 在主分支上进行 merge 的时候可能会产生冲突.: v0 d0 W0 A4 l% K6 X
以下构造一个冲突的示例:& p) G9 g; S, _( Q h9 A
$ L7 E$ G; Q" g) ]$ git branch test # 创建一个分支 test, 但是没有进入test分支, 此时还在 master 分支上.7 z2 w1 ?; U3 d. E' C0 r
$ vim xxxx # 编辑 master 分支上的一个已有的文件* e* W+ {/ t* u2 d( J. c6 _4 {" |
$ git commit -am 'xxx message' # 提交 master 分支的修改
' k' A! `! i9 c( { I A- V$ git checkout test # 切换到 test 分支
2 L+ p1 m0 y- G5 F# q1 q$ vim xxxx # 编辑之前在 master 上编辑的文件, 可以编辑同一个地方, 造成冲突
9 u- I5 x {1 u% H; ~$ C$ git commit -am 'xxx message' # 提交 test 分支的修改
! X9 a I% D# o* ^, N, d; W$ git checkout master # 切换到 master 分支
5 h- Z s" ^, a: {+ J/ u$ git merge test # 将 test 分支合并到 master 分支, 由于上面编辑了同一文件, 这里会产生冲突2 `: _8 x/ c" l+ x& d4 E9 ]( o
Auto-merging xxxx, z5 W9 a4 D$ N; J# J1 r) p$ l
CONFLICT (content): Merge conflict in xxxx0 `3 j n7 `$ ?
Automatic merge failed; fix conflicts and then commit the result.
6 R# ?+ D! I' \1 `9 E n最后, 参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.6 m- G. Q1 a; o0 j8 w
% _8 u* Z3 d1 ~+ U' g$ ^通过 git 提取补丁( ^6 `1 D" Q7 J! G
提取的补丁的方法有多种:
* L# p% k( e5 J8 O
: O! d! `% l. |0 W" Z$ git format-patch -1 # 提取本次 commit 和上次 commit 之间的不同, 并生成patch文件* i5 A9 g& k, T
$ git format-patch -2 # 提取本次 commit 和 上上次 commit 之间的不同, 并生成patch文件6 A5 L/ o" z7 F& |: y- D
$ git format-patch commit号1 commit号2 # 提取2次commit号之间的不同, 并生成patch文件 (commit号可以通过 git log 来查看)
3 _1 f1 d7 |, \7 A2 C$ git format-patch tag1 tag2 # 提取2次tag之间的不同, 并生成patch文件 (tag可以通过 git tag 来查看)
2 N Q' [" r' P" j4 A通过 git 提取指定版本的源码
2 n$ ]( U" R9 K+ @+ _/ |这个功能在部署的时候比较有用.- d1 p8 G2 W& |# Z4 M+ M
+ a; y0 }. R X; h
$ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar # 获取 tagxx 的源码, 加了 --prefix 的作用是在最终的 tagxx.tar 中加了一层文件夹 tagxx# S) e3 `; j* S0 q; \
上面的 tagxx 也可以是 commit号 |
|