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

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

 找回密码
 点击获取邀请码 - 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

Git指令大百科

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

参加活动:0

组织活动:12

发表于 2017-8-24 14:52:53 | 显示全部楼层 |阅读模式 来自- 广东广州
配置
+ u! K, C0 E9 v5 J8 I) p# z$ ~5 e
首先是配置帐号信息
( D& u' ^( O) G/ G0 D* t
ssh -T git@github.com#登陆github

5 z" N; ?: D/ S  L4 n
修改项目中的个人信息

; S  O! t5 b# G: k( I5 i
git config --global user.name "githelper"
git config --global user.email githelper@gmail.com
- u0 ~2 a; Y7 z
config

/ o2 b: g' Y7 g: S' Y
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#添加远程路径

1 a0 y; V' O1 {: c
help

2 F9 v; A  F7 L. y
git help config#获取帮助信息
5 G) S) O4 S$ r9 K
配置自动换行(自动转换坑太大)
- v% B, ?7 v# D4 ?6 u
git config --global core.autocrlf input#提交到git是自动将换行符转换为lf

+ J/ z1 p7 U* f% o
配置密钥
+ ~* O) ?$ _+ f' y, Y) K( @
ssh-keygen -t rsa -C JSLite@yeah.net#生成密钥
ssh -T git@github.com#测试是否成功

" `4 H; o2 o8 o& V! s
多账号ssh配置

! k, Z: |# Z( B% ]# B
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

$ M+ Q7 S9 c" i5 r7 \" b

2 l1 r1 t; L4 Y/ V( f* m
push
& f1 d8 C( a# B. Y' ]+ s
git push origin master
git push -f origin master#强制推送

8 S, H0 f1 D. P  L# f3 V! ~
缩写 -f
全写--force
注:强制推送文件没有了哦
  D$ M2 @* }0 ]7 z/ {% l/ c  ]4 C
pull
- G) P! L: Y6 R% `# g
只能拉取origin里的一个url地址,这个fetch-url
默认为你添加的到origin的第一个地址
6 r- N. U  g4 p' E6 q  h
git pull origin master
git pull --all#获取远程所有内容包括tag
git pull origin next:master#取回origin主机的next分支,与本地的master分支合并
git pull origin next#远程分支是与当前分支合并
4 @# Z9 u5 v% z$ Z5 E
上面一条命令等同于下面两条命令

) I) b- H8 D6 G! H. c5 }8 s
git fetch origin
git merge origin/next
8 W& s- A6 x* T. K
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
2 ?; V3 K1 V# h5 `: h0 n
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
  v5 `: F7 ^! D: \& x
$ git pull -p
! F$ i/ Y- I6 {- ~# G+ P
等同于下面的命令

1 o( ^' m2 e  b0 |
$ git fetch --prune origin
$ git fetch -p

' u  x- P3 _" Y$ X7 M" r

; k' q3 E/ y% Y9 z" h) d
新建仓库init

0 }/ X* \( |( H/ |1 C% n
git init#初始化
7 V) H$ ^  ~2 W' H
status

1 y9 N8 X3 l) h8 e
git status#获取状态

" j# C' d! J8 ^9 t* M9 v
add
7 ~* K5 n, S0 b1 j& N' G0 z& D  P
git add file#.或*代表全部添加
git rm --cached 在commit之前撤销git add操作
git reset head好像比上面git rm --cached更方便

$ b2 g  e4 c( Z5 L1 b7 I: O# a5 b0 H4 O
commit
5 N. k$ q1 n7 F3 y4 |
git commit -m "message"#此处注意乱码

/ I/ ~0 H& W4 t; h
remote

4 b/ z$ Y$ Y& D/ h: D
git remote add origin git@github.com:JSLite/test.git#添加源
1 Q8 T7 _- {1 R  Q/ q$ K# t
push
. Z7 @* ~1 ~* [* z& ~" o; M6 V
git push -u origin master#push同事设置默认跟踪分支
git push origin master

6 i: W0 E/ P) _# t' n4 o) _
从现有仓库克隆
# n" s: P' h$ G9 L9 r* I
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协议还有另一种写法。
0 F7 r- x- n9 x9 T  K
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。$ git clone <版本库的网址> <本地目录名>
* E- ]. c8 O& m3 V; x
$ 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/
. {8 c2 \2 W  N7 Y
submodule
7 }1 g1 S+ U5 G3 f/ O% Y6 Z
git submodule add --force 仓库地址 路径
% w7 @5 _5 y5 n6 c4 J2 b
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)
: @. c+ q- X! X8 p7 o
git submodule init初始化submodule
git submodule update更新submodule(必须在根目录执行命令)
0 `" Q* o" v/ Z! W& r
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:

- e+ Y! s  c# |' O* h
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
2 W7 B- o/ u4 U7 U
# m2 u: p1 A9 a/ Z
本地

0 \$ S, {& y9 _0 b  T* b+ j* W
add

+ s9 g; l# l8 ~2 g8 N
git add *#跟踪新文件
git add -u [path]#添加[指定路径下]已跟踪文件

* w' ?$ m% r" t* V9 @
rm

/ n$ _. w# c. @$ t5 O( E0 m9 a
rm &git rm #移除文件
git rm -f *#移除文件
git rm --cached *#取消跟踪
git mv file_from file_to#重命名跟踪文件
git log#查看提交记录
2 J, v% y! M) C, g
commit
: \" D6 x, I6 S1 P
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.详细描述'#提交简要描述和详细描述
; @+ {9 z: J1 d# t
reset

" {$ T4 I& B/ n* L, p$ E9 t! {
git reset HEAD*#取消已经暂存的文件
git reset --mixed HEAD*#同上
git reset --soft HEAD*#重置到指定状态,不会修改索引区和工作树
git reset --hard HEAD*#重置到指定状态,会修改索引区和工作树
git reset -- files*#重置index区文件
6 E# r1 I# h0 r: m2 p6 d4 j
revert

0 ]) }+ [( c5 y& l1 O; M
git revert HEAD#撤销前一次操作
git revert HEAD~#撤销前前一次操作
git revert commit##撤销指定操作

5 U+ ]$ x/ |2 _$ k
checkout

3 v. h8 d* b* Q* W% W$ [9 k; r
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
, u/ v! ^& t1 |3 L- l1 X
diff

- ]3 m, n1 i! i$ F. `* ]
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个'.'来取代前面的两个'.'
0 L/ }9 N& {1 E6 Z- K9 l
stash
- D$ A1 f8 }% V' x: d4 r+ h3 w
git stash#将工作区现场(已跟踪文件)储藏起来,等以后恢复后继续工作。
git stash list#查看保存的工作现场
git stash apply#恢复工作现场
git stash drop#删除stash内容
git stash pop#恢复的同时直接删除stash内容
git stash apply stash@{0}#恢复指定的工作现场,当你保存了不只一份工作现场时。

2 v, _* b8 j+ r. g" T4 c$ ?; R2 r
merge
0 k9 \- t. h. N+ J' o: E0 g9 z9 a
git merge --squash test##合并压缩,将test上的commit压缩为一条
cherry-pick
git cherry-pick commit#拣选合并,将commit合并到当前分支
git cherry-pick -n commit#拣选多个提交,合并完后可以继续拣选下一个提交

- m9 Y( h% V% J4 N2 h
rebase
& w. f0 ^9 N8 O
git rebase master#将master分之上超前的提交,变基到当前分支
git rebase --onto master 169a6#限制回滚范围,rebase当前分支从169a6以后的提交
git rebase --interactive#交互模式,修改commit
git rebase --continue#处理完冲突继续合并
git rebase --skip#跳过
git rebase --abort#取消合并
1 {' i1 a- A5 ~
+ c& F  I/ Z- ~) ^% S- |0 d' ^1 t
分支branch
1 j0 C; U9 q7 Y& M8 t
删除

' G  R5 z; {4 g9 H5 C' n
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分支

) I+ \5 J5 w5 g: F$ H9 M$ v/ P1 V- A
提交

2 C$ Y" d5 y3 N$ {# f$ y. T0 s8 e; d
git push -u origin branchName#提交分支到远程origin主机中

% H* t6 v9 g6 N# b# V& e4 ?
拉取

) k" M0 @9 u. R5 ]6 O5 @
git fetch -p#拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。

4 B/ n5 A  ^( g7 a8 r7 T
分支合并
8 D( ?" ~: m( C( U6 R( c3 Y
git merge branchName#合并分支 - 将分支branchName和当前所在分支合并
git merge origin/master#在本地分支上合并远程分支。
git rebase origin/master#在本地分支上合并远程分支。
git merge test#将test分支合并到当前分支

) g, g3 x5 ~% S% U1 Z- p1 D+ \  c
重命名

9 L6 Q0 S% s1 C. r4 {
git branch -m old new#重命名分支

& h3 y9 G, ~" B+ M5 z6 Y- a, E$ r
查看

( T% K3 M7 }3 W3 }1 {; l
git branch#列出本地分支
git branch -r#列出远端分支
git branch -a#列出所有分支
git branch -v#查看各个分支最后一个提交对象的信息
git branch --merge#查看已经合并到当前分支的分支
git branch --no-merge#查看为合并到当前分支的分支

) B6 G/ u* o3 x) S) M- {$ f
新建
8 P9 Z  Y0 o7 _7 @4 j. D1 C
git branch test#新建test分支
git checkout -b newBrach origin/master#取回远程主机的更新以后,在它的基础上创建一个新的分支

0 A+ y0 l* J4 S7 K) @
连接

$ E9 B- A5 d: m  @$ M
git branch --set-upstream dev origin/dev#将本地dev分支与远程dev分支之间建立链接
git branch --set-upstream master origin/next#手动建立追踪关系

) E2 S2 y- ^7 W3 \$ Q1 V
分支切换
" ~/ @* Q. p2 K# T
git checkout test#切换到test分支
git checkout -b test#新建+切换到test分支
git checkout -b test dev#基于dev新建test分支,并切换
9 q1 c& ?0 z/ X8 p5 u4 z+ v1 M
远端
2 z( V$ J" Z8 g3 T" O
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分支[同时设置跟踪]

- T& c( R; d6 ^! d" z6 v

; s3 g% M% U! J. `* L
撤销远程记录

, ]* A* Y- |# t
git reset --hard HEAD~1#撤销一条记录
git push -f origin HEAD:master#同步到远程仓库

8 C6 n( u3 a0 ~# D/ L  l
忽略文件

( e+ }) @$ c8 ?) S& k9 H4 N$ p4 o
echo node_modules/ >> .gitignore

) S3 P: H1 O3 D" z) q
删除文件
+ P  @$ j( P! N! o. e, O7 U% n
git rm -rf node_modules/
$ N8 A" M$ I$ a, z2 a# h+ U
源remote
0 w0 i9 G; t4 b0 n$ B( O
git是一个分布式代码管理工具,所以可以支持多个仓库,在git里,服务器上的仓库在本地称之为remote。

& T3 V$ N& f: L0 Z
个人开发时,多源用的可能不多,但多源其实非常有用。
! O5 Q  T, m; i; |
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#查看指定源的全部信息
$ L7 j% |9 B) P) P, {2 q0 N
原创:来自GIT小助手

$ l) e2 V, O! B7 Q2 r

本版积分规则

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

QQ|小黑屋|手机版|Archiver|ITIL先锋论坛五万运维人社区 ( 粤ICP备17056641号|网站地图

Baidu

GMT+8, 2018-8-22 11:32 , Processed in 0.227063 second(s), 36 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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