请选择 进入手机版 | 继续访问电脑版

IT运维管理,ITIL,ITSS,ITSM,ISO20000-ITIL先锋论坛

 找回密码
 微信、QQ、手机号一键注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

艾拓先锋
搜索
查看: 450|回复: 0

Git指令大百科

[复制链接]
来自- 广东广州

参加活动:0

组织活动:12

发表于 2017-8-24 14:52:53 | 显示全部楼层 |阅读模式 来自- 广东广州
配置

3 X' ?; d7 t5 `. Y+ q4 j
首先是配置帐号信息

+ U, |# h$ u  f- B% O0 P2 f
ssh -T git@github.com#登陆github
9 z# Y+ p, `6 y
修改项目中的个人信息

: B* [" T" ~% k( S  q0 U$ }) u' X
git config --global user.name "githelper"
git config --global user.email githelper@gmail.com
. x2 c7 l: i! \' `0 J. f. b. D
config
, M/ [3 Y: S& v
git config --global user.name JSLite#设置提交用户名
git config --global user.email JSLite@yeah.net#设置提交邮箱
git config --list#查看配置的信息
git remote remove origin#删除该远程路径
git remote add origin git@jslite.github.com:JSLite/JSLite.git#添加远程路径

8 x9 ~! [, U4 Z+ G  v  D4 y3 m
help

* A; G2 C" p# _: E, O$ `9 k
git help config#获取帮助信息

% O& L. R# K  n& F1 g$ t+ b
配置自动换行(自动转换坑太大)

; b. I2 L6 C; W  y! F. C2 A7 p
git config --global core.autocrlf input#提交到git是自动将换行符转换为lf

- K. `( v$ l0 B; Y% o! s/ U) @
配置密钥
& p7 Z; k9 _6 }
ssh-keygen -t rsa -C JSLite@yeah.net#生成密钥
ssh -T git@github.com#测试是否成功

. R2 @8 U8 x( i
多账号ssh配置

4 Z6 g8 @9 M  n" D6 ]' X* L
1.生成指定名字的密钥
ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/github_jslite
会生成github_jslite和github_jslite.pub这两个文件
2.密钥复制到托管平台上
vim ~/.ssh/github_jslite.pub
打开公钥文件github_jslite.pub,并把内容复制至代码托管平台上
3.修改config文件
vim ~/.ssh/config#修改config文件,如果没有创建config
Host jslite.github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_jslite
Host abc.github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_abc
4.测试
ssh -T git@jslite.github.com#@后面跟上定义的Host
; X" f) j! R* t( K3 g! O

+ O- i! d6 k4 V9 g
push

) [/ @) b! K" u  R
git push origin master
git push -f origin master#强制推送

1 |9 O2 b3 P. ?* o% {
缩写 -f
全写--force
注:强制推送文件没有了哦

2 H% Q- V6 W8 i7 U" P! `% O- }% y
pull

) i. U% g3 `# l4 D; v9 t7 [
只能拉取origin里的一个url地址,这个fetch-url
默认为你添加的到origin的第一个地址
6 C* z4 l8 u' J
git pull origin master
git pull --all#获取远程所有内容包括tag
git pull origin next:master#取回origin主机的next分支,与本地的master分支合并
git pull origin next#远程分支是与当前分支合并

* M/ [' Q9 O' M* [3 P$ E* O1 W
上面一条命令等同于下面两条命令

7 Z8 g6 ]3 G( Y
git fetch origin
git merge origin/next
" V+ c6 W4 o7 j
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。

; `3 s( ]3 A5 [) D
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

/ a1 }. K  ]) S1 n7 p8 I1 b4 L
$ git pull -p

+ k) o7 t, y4 r2 `0 {! \& f
等同于下面的命令
1 J. \( z2 c* ~  ]5 ?8 L3 D9 z
$ git fetch --prune origin
$ git fetch -p
* g7 C4 i; N" R$ @$ [: G
  G$ F, X  g) [. L1 z: ?1 l8 H8 z
新建仓库init

5 @. G- S( N5 `
git init#初始化
2 {8 X) k. C+ i2 [& q" H
status
0 z$ z" F' G$ M# {( }9 i! d) u: P. [
git status#获取状态
, W5 j/ x1 i  @+ [
add
+ ^  D9 K  X5 a0 b7 V1 s0 r* l" P
git add file#.或*代表全部添加
git rm --cached 在commit之前撤销git add操作
git reset head好像比上面git rm --cached更方便

0 \. G4 \% h2 @; X: n1 N! J9 f
commit

6 @- m8 k+ O9 w2 F) Z6 s
git commit -m "message"#此处注意乱码

$ `  y1 V) l9 p5 A
remote
& b! e2 z0 D( ]5 L6 T1 m& j
git remote add origin git@github.com:JSLite/test.git#添加源
+ E; H! s1 R. E0 f
push
; l, H* E% S8 ^+ D2 W3 ]# W
git push -u origin master#push同事设置默认跟踪分支
git push origin master

* G# {9 W8 B, w2 K7 o5 Y
从现有仓库克隆

0 D* O  \& ^* \' x' Q/ W
git clone git://github.com/JSLite/JSLite.js.git
git clone git://github.com/JSLite/JSLite.js.git mypro#克隆到自定义文件夹
git clone [user@]example.com:path/to/repo.git/#SSH协议还有另一种写法。
1 C  V* V7 `$ |5 }& |
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。$ git clone <版本库的网址> <本地目录名>
4 A. U. S9 p+ S7 ^5 @# g
$ git clone http://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
. u1 Z( n2 J( j( y! f7 a
submodule
9 N' N5 p% b3 g( e, h6 k5 i
git submodule add --force 仓库地址 路径
# K4 c7 D( x0 s9 y& |- z
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)

$ p0 K: l0 D) Z1 n
git submodule init初始化submodule
git submodule update更新submodule(必须在根目录执行命令)

+ m  |. B* I# e- Z& d8 ?, G. Y- b
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
" i% B( ?8 x( E+ E/ c
git submodule update --init --recursive下载的工程带有submodule
git submodule foreach git pullsubmodule 里有其他的 submodule 一次更新
git submodule foreach git pull origin mastersubmodule更新
git submodule foreach --recursive git submodule init
git submodule foreach --recursive git submodule update

, o, f9 R1 v& `6 V1 W! y- a
; P1 d6 N: q! K8 F
本地
* n; w* c- l2 n" X6 J- Y
add

$ _  T  ?/ N! h2 \; a
git add *#跟踪新文件
git add -u [path]#添加[指定路径下]已跟踪文件

: E; x; O5 z' t$ E$ Y
rm

  F- f. O! z' s  S
rm &git rm #移除文件
git rm -f *#移除文件
git rm --cached *#取消跟踪
git mv file_from file_to#重命名跟踪文件
git log#查看提交记录
0 I1 k+ p: Z, o( z
commit
9 f* q" ?+ b6 |& i; D& ]% H
git commit#提交更新
git commit -m 'message'#提交说明
git commit -a#跳过使用暂存区域,把所有已经跟踪过的文件暂存起来一并提交
git commit --amend#修改最后一次提交
git commit log#查看所有提交,包括没有push的commit
git commit -m "#133"#关联issue 任意位置带上#符号加上issue号码
git commit -m "fix #133"commit关闭issue
git commit -m '概要描述'$'\n\n''1.详细描述'$'\n''2.详细描述'#提交简要描述和详细描述

0 B& m' Z$ N2 P7 c: K# o' E% j
reset

( R. b( R% S, [  E; T
git reset HEAD*#取消已经暂存的文件
git reset --mixed HEAD*#同上
git reset --soft HEAD*#重置到指定状态,不会修改索引区和工作树
git reset --hard HEAD*#重置到指定状态,会修改索引区和工作树
git reset -- files*#重置index区文件
; f4 V, M* |! G+ K6 ?7 M, J; @
revert
; r; ?+ a7 s; i
git revert HEAD#撤销前一次操作
git revert HEAD~#撤销前前一次操作
git revert commit##撤销指定操作

3 D9 d# w* a  }! L( B7 y
checkout

: e* h. W0 H) W; {# y% d) N  i
git checkout -- file#取消对文件的修改(从暂存区------覆盖worktree file)
git checkout branch|tag|commit -- file_name#从仓库取出file覆盖当前分支
git checkout HEAD~1 [文件]#将会更新 working directory 去匹配某次 commit
git checkout -- .#从暂存区取出文件覆盖工作区
git checkout -b gh-pages 0c304c9这个表示 从当前分支 commit 哈希值为 0c304c9 的节点,分一个新的分支gh-pages出来,并切换到 gh-pages
# c* A6 F# W8 W4 q8 ?* h! p
diff

9 a2 c+ r5 v+ i; o. m5 |
git diff file#查看指定文件的差异
git diff --stat#查看简单的diff结果
git diff#比较Worktree和Index之间的差异
git diff --cached#比较Index和HEAD之间的差异
git diff HEAD#比较Worktree和HEAD之间的差异
git diff branch#比较Worktree和branch之间的差异
git diff branch1 branch2#比较两次分支之间的差异
git diff commit commit#比较两次提交之间的差异
$ git diff master..test#上面这条命令只显示两个分支间的差异
git diff master...test#你想找出'master','test'的共有 父分支和'test'分支之间的差异,你用3个'.'来取代前面的两个'.'
# M  n7 G/ k' Y; W4 s( p3 L1 x
stash
* w1 A- Q' [# C1 c
git stash#将工作区现场(已跟踪文件)储藏起来,等以后恢复后继续工作。
git stash list#查看保存的工作现场
git stash apply#恢复工作现场
git stash drop#删除stash内容
git stash pop#恢复的同时直接删除stash内容
git stash apply stash@{0}#恢复指定的工作现场,当你保存了不只一份工作现场时。

/ _" l8 Q( [5 Q9 K- |3 l) j/ x& v
merge
8 s% v- }9 q! ?/ Y" ~
git merge --squash test##合并压缩,将test上的commit压缩为一条
cherry-pick
git cherry-pick commit#拣选合并,将commit合并到当前分支
git cherry-pick -n commit#拣选多个提交,合并完后可以继续拣选下一个提交
9 s, z5 G, r6 S3 R! }4 W
rebase
- S6 p  e7 Z! L/ j9 |$ E
git rebase master#将master分之上超前的提交,变基到当前分支
git rebase --onto master 169a6#限制回滚范围,rebase当前分支从169a6以后的提交
git rebase --interactive#交互模式,修改commit
git rebase --continue#处理完冲突继续合并
git rebase --skip#跳过
git rebase --abort#取消合并

0 f5 Z& Y; C& h# a1 e$ \
' {6 o$ w2 l5 Y# _" c1 l
分支branch9 I7 h7 F1 ~! t% l  U! X
删除
% y4 \. R6 v& n. z7 `" L
git push origin :branchName#删除远程分支
git push origin --delete new#删除远程分支new
git branch -d branchName#删除本地分支,强制删除用-D
git branch -d test#删除本地test分支
git branch -D test#强制删除本地test分支
9 W: ?: }' K$ ^1 ]8 k/ G9 r
提交

* z" `/ n1 u! M( h( b
git push -u origin branchName#提交分支到远程origin主机中

' b) C# S' I2 w
拉取
9 {" d5 o- W- V2 _
git fetch -p#拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。
3 I. R. H0 G" |$ J
分支合并

, n" U! Q* }5 R# k+ x  s# u, O. }( S
git merge branchName#合并分支 - 将分支branchName和当前所在分支合并
git merge origin/master#在本地分支上合并远程分支。
git rebase origin/master#在本地分支上合并远程分支。
git merge test#将test分支合并到当前分支

5 W. R3 U) z, I( R/ D( p
重命名
$ k9 o. @- c+ ~8 K
git branch -m old new#重命名分支
/ u/ y& G, S* |" ?" r* ~
查看

% w- D' n' @1 s7 k- b. g' c. N
git branch#列出本地分支
git branch -r#列出远端分支
git branch -a#列出所有分支
git branch -v#查看各个分支最后一个提交对象的信息
git branch --merge#查看已经合并到当前分支的分支
git branch --no-merge#查看为合并到当前分支的分支
; V; |5 ?% y6 S
新建
( d* d% V/ _3 e
git branch test#新建test分支
git checkout -b newBrach origin/master#取回远程主机的更新以后,在它的基础上创建一个新的分支

" g! g1 H) `, Y
连接
6 o6 N" h, I- k; N  c4 V
git branch --set-upstream dev origin/dev#将本地dev分支与远程dev分支之间建立链接
git branch --set-upstream master origin/next#手动建立追踪关系

$ [4 g3 f: H$ G7 q( ^
分支切换

" s; a! Q' A) E
git checkout test#切换到test分支
git checkout -b test#新建+切换到test分支
git checkout -b test dev#基于dev新建test分支,并切换

( K5 \0 e7 @2 Z" a
远端
2 j% r+ Z# j4 X' e' u5 G( c
git fetch <远程主机名> <分支名>#fetch取回所有分支(branch)的更新
git fetch origin remotebranch[:localbranch]# 从远端拉去分支[到本地指定分支]
git merge origin/branch#合并远端上指定分支
git pull origin remotebranch:localbranch# 拉去远端分支到本地分支
git push origin branch#将当前分支,推送到远端上指定分支
git push origin localbranch:remotebranch#推送本地指定分支,到远端上指定分支
git push origin :remotebranch#删除远端指定分支
git checkout -b [--track] test origin/dev基于远端dev分支,新建本地test分支[同时设置跟踪]

  J% X- v9 M4 ?$ M- {" i. b9 H
2 W* |; u$ d$ L$ i' j- v6 H
撤销远程记录

5 x/ y3 z, S# B% ?$ P# Q4 z0 {3 t! |  v
git reset --hard HEAD~1#撤销一条记录
git push -f origin HEAD:master#同步到远程仓库

) g$ h6 y$ \; l
忽略文件
- j, h9 t3 |, \# B, x$ n( v. a, `! L& c3 B9 ^
echo node_modules/ >> .gitignore

- E. i* K- }: U. E% z& |3 \
删除文件

  k+ U' e0 b  \9 b5 M
git rm -rf node_modules/
' y4 D$ J9 Y  N/ j5 |2 t2 P- V- R
源remote
" c! R3 X& E( d3 h4 z3 q3 V2 s
git是一个分布式代码管理工具,所以可以支持多个仓库,在git里,服务器上的仓库在本地称之为remote。
4 p2 w. D+ H5 H4 o4 j
个人开发时,多源用的可能不多,但多源其实非常有用。
) T. ^/ n* L0 t5 X4 w5 C/ x
git remote add origin1 git@github.com:yanhaijing/data.js.git
git remote#显示全部源
git remote -v#显示全部源+详细信息
git remote rename origin1 origin2#重命名
git remote rm origin#删除
git remote show origin#查看指定源的全部信息
3 J0 X& c- B* ?# J3 n8 g
原创:来自GIT小助手

. U& n2 ~$ I4 |9 ], P

本版积分规则

选择云运维时代的王牌讲师-长河老师,助你轻松入门ITIL Foundation培训课程

QQ|小黑屋|手机版|Archiver|艾拓先锋网 ( 粤ICP备11099876号-1|网站地图

Baidu

GMT+8, 2018-10-17 01:34 , Processed in 0.274555 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表