Git常用命令

写在前面

本文主要讲述常用命令的使用:
init(初始化)
clone(克隆远程仓库)
config(配置指令)
pull(拉取远程仓库指令)
fetch(拉取指令)
add()
commit(提交指令)
push(上传指令)
mv(移动指令)
show()
log(日志指令)
diff(差异对比指令)
checkout(检出指令)
reset(回滚指令)
revert(撤销指令)
rm(删除指令)
branch(分支指令)
status(状态指令)

1. GIT架构

GIT架构

2. 名词解释

  ★ workspace:工作区。项目文件夹,可直接进行编辑。
  ★ Index/Stage:暂存区。包含文件索引的目录树,记录文件名、时间戳、文件长度等信息。
  ★ Repository:本地仓库。
  ★ Remote:远程仓库。
  ★ origin:默认远程版本库名
  ★ master:默认分支名
  ★ HEAD:当前分支引用的指针,总是指向该分支上的最后一次提交(commit)。通常,可以把HEAD看作上一次提交的快照。

注:
  1.暂存区不保存文件内容,文件内容是存储在Git对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。
  2.除非绕过暂存区直接提交文件,否则想把修改文件提交上去,就必须先存入暂存区后才能commit,每次提交的都是暂存区所对应的文件快照。

3. 四种文件状态

状态转换

注:
  状态仅代表文件状态的变迁,不能代表存储位置
  暂存区的处于暂存区的文件状态:staged、Unmodify。

Untracked:未跟踪。在暂存区以及本地仓库都不存在该文件。
Unmodify:已入库,未修改。文件已存入本地仓库,此时工作区、暂存区、本地仓库文件内容一致。
Modified:已修改。文件已存在并进行修改,但未add。
Staged:暂存。文件已提交至暂存区,未commit提交至本地仓库。

状态提示:
  Changes to be committed:暂存状态,已add,未commit
  Changes not staged for commit:文件已修改,未add,若此时进行commit,仅会将之前处于Changes to be committed状态下的文件快照进行提交,只有暂存区的文件可被commit
  Changes to be committed:文件已暂存
紧凑格式

git status -s
or
git status --short

//简短显示内容:
   M README       //文件已修改并放入了暂存区
M lib/simplegit.rb  //修改过的文件,还未放入暂存区,两者按照M位置区分(左(未放)、右(已放))
MM Rakefile   //修改并提交至暂存区后,又被修改还未提交
A lib/git.rb    // 新添加到暂存区文件
?? LiCENSE.txt    //  ??表示未跟踪文件

4. 常用命令

4.1 init、clone

新建代码库

git init  //在当前目录初始化一个Git代码库
git init name    //新建一个目录,并将其初始化未Git代码库
git  clone url    //克隆一个项目和它的代码历史

4.2 config

配置指令
Git的设置文件未.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)

git config           //显示当前的Git配置
git config -e --global           //设置Git全局属性

//设置提交代码时的用户信息
git config --global user.name "name"
git config --global user.email "email address"

4.3 pull

拉取、整合代码指令
git pull 相当于git fetch + git merge

git pull <选项> <远程仓库名> <远程分支名>:<本地分支名>

说明:
   ☆ 已commit未push: 即工作区,暂存区,本地仓库代码版本一致。两种情况
      1.与本地新增代码远程仓库不冲突时,git pull操作会同时更新工作区、暂存区、本地仓库内容到最新且保留修改内容。
      2. 代码有冲突,则冲突代码写入工作区,需手动处理。处理之后pull、add、commit、push。此时push会以本地仓库内容为准,即使所提交内容与远程仓库内容有冲突也不再提示而是直接用本地仓库内容来来替换远程仓库内容。
   ☆ 未commit :不管是已经add 还是未add,若git pull 有冲突则会提示异常以及异常解决办法,不会直接将冲突代码写入工作区。通常提示需要commit 或 stash后才能merge

注: 冲突处理之后内容提交会直接覆盖远程仓库内容,如下例:

原始代码为:aaaaa
他人提交为:acccc
本地代码为:aeeee
此时git pull 提示代码冲突,如下。

  <<<<<< HEAD
  aeeee
  =========
  acccc
  >>>>>  c16adfegbn

修改代码保留本地修改内容
aeeee

此时进行add、commit、push 后不会提示冲突而是直接在远程仓库内进行更新操作即将  acccc 更改为  aeeee

4.4 add

使用当前工作区的内容更新索引(暂存区)

git add [参数] [路径] 

常用参数
  ☆ 不加参数:仅提交修改和新增文件,不包括删除文件。
  ☆ -u:仅提交已修改和删除的文件至暂存区,不包括新增文件。
  ☆ -A:提交已修改、删除、新增文件至暂存区。
  ☆ -i:查看已修改和已删除但没有提交的文件目录

4.5 commit

提交指令
仅提交放在暂存区的快照,任务还未暂存的仍将保持修改状态不会被提交

  1.'-m' 常规提交

git commit -m "message"

  2. '-a' 强制提交
  说明: a标识将已修改、删除的文件全部提交至版本库,即使它们没经过git add。注意新建文件不能被提交至本地仓库。

git commit -am "message"

  3. '’amend' 追加提交
可以在不新增commid-id的情况下将新修改的代码追加至已有的commid-id中。

1. 切换至需要更新的版本
2. 增加新内容
3. add
4. git commit --amend
5. git push

其他用法请查看 “git commit --h”

4.6 push

推送指令

git push [参数] <远程仓库名>  <本地分支名>:<远程分支名>

常用指令

  ☆ git push origin master
    将本地master分支推送到origin 主机的master上,若master不存在,则创建。
  ☆ git push origin :master
    如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的分支到远程分支。等同于:git push origin --delete master
  ☆ git push origin
    表示将当前分支推送到origin主机的对应分支。
  ☆ git push
    当且仅当当前分支只有一个追踪分支时,可以省略主机名。
  ☆ git push -u origin master
    指定默认主机。若当前分支与多个主机分支存在追踪关系,则可以用 “-u”来指定一个默认主机,这样后面就可以不加任何参数使用 git push
  ☆ git push --all origin
    不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机。
  ☆ git push --force origin
    强制推送。尽量避免强制推送
  ☆ git push origin --tags
    push默认不会推送标签,除非使用--tags选项

注: 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。如果要修改这个设置,可以采用git config命令。

4.7 fetch

4.8 mv

移动指令

git mv  相当于

mv old new 
git rm old
git add new

4.9 show

4.10 log

查看提交历史指令

常用选项

选项 说明
-p 按补丁格式显示每个更新之间的差异
--stat 显示每次更新的文件修改统计信息
--shortstat 只显示 --stat中最后的行数修改添加移除统计
--name-only 仅在提交信息后显示已修改的文件清单
--name-status 显示新增、修改、删除的文件清单
--abbrev-commit 仅显示SHA-1的前几个字符,而非所有40个字符
--relative-date 用较短的相对时间显示
--graph 显示ASCII图形表示的分支合并历史
--pretty 使用其他格式显示历史提交信息,常用oneline、short、full、fuller、format
-(n)} 仅显示最近的n条提交
--since、--after 仅显示指定时间之后的提交
--until,--befor 仅显示指定时间之间的提交
--author 仅显示指定作者相关的提交
--commiter 仅显示指定提交者的提交
--grep 仅显示含指定关键字的提交(提交说明中的关键字)
-S 仅显示添加或移除了某个关键字的提交

注: 使用其他关键字与 --grep配合搜索时,必须使用 --all-match选项才能得到同时满足这两个选项的提交,否则,满足任意一个条件都会被搜索出来

实例

//默认查询,按提交时间列出所有更新
git log

// -p : 显示每次提交的内容差异
// -2 : 仅显示最近的两次提交
git log -p -2

//总结性质选项,每次提交的简略的统计信息,
//列出所有被修改过的文件,有多少文件被修改了、
//被修改的文件哪些行被移除或添加了
git log --stat

//指定使用不同于默认格式的方式展示提交历史
//有内建选项供使用,例 online(每个提交在一行显示)、short、full、fuller、format
git log --pretty=online

//定制格式化输出,利于后期提取分析
git log --pretty=format:"%h - &a, &ar : %s"

// --graph可形象的展示分支、合并历史
git log --pretty=format:"%h %s" --graph

  * 2d3acf9 ignore errors from SIGCHLD on trap
  * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
  |\
  | * 420eac9 Added a method for getting the current branch.
  * | 30e367c timeout code and tests
  * | 5a09431 add timeout protection to grit
  * | e1193f8 support for heads with slashes in them
  |/
  * d6016bc require time for xmlschema
  * 11d191e Merge branch 'defunkt' into local
// --since 仅显示最近两周内的提交
git log --since=2.weeks

//显示2008年10月期间,gitster提交的但未合并过的文件
 git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t

注: format的常用选项,请自行度娘

4.11 diff

差异检查
比较工作区与暂存区快照间的差异

//仅显示尚未暂存的内容,而不是自上次提交以来的所有改动
git diff 

//查看已经暂存起来的变化
git diff --cached

实例

4.12 checkout

检出指令

4.13 reset

回滚指令

git reset [--soft | --mixed | --hard] [<commit>]
or
git reset [--soft | --mixed | --hard] [HEAD]

  说明:
    <commit>:commit的hashcode(版本号)
    [HEAD]:
      HEAD or HEAD~0 最近的一个提交(倒数第一次)
      HEAD^ or HEAD~1 上一次提交(倒数第二次)
      HEAD^^ or HEAD~2 上上次提交(倒数地三次)
      HEAD^. ..^ or HEAD~n 倒数第N次提交

三种回滚方式
  1.仅回退版本库,保留暂存区、工作区

git reset --soft HEAD~n

  2.回滚版本库、暂存区,保留工作区
该操作为reset的默认操作。此时若想回滚工作区,需执行checkout指令。

git reset HEAD~n
or
git reset --mixed HEAD~n

  3.版本库、暂存区、工作区全部回滚

git reset --hard HEAD~n

注:
   使用reset后,在git log中的commit记录也会被删除
   上述代码中 n 代表回滚的版本可以是版本号,也可以是数字。比如1表示上一个版本,2表示倒数3个版本

4.14 revert

回滚指令

git revert <commit> 撤销指定的提交

注: 相比于reset会修改commit history。revert是通过创建一次新的commit来撤销一次commit所作的修改。此种操作相较reset较为安全。

4.15. rm

移除指令
从已跟踪文件清单中移除(暂存区移除),然后提交(commit、push)

git rm本质是 rm + git add 。若需要同步至本地仓库,在执行玩rm后需要执行commit来将执行结果提交至本地仓库。

git rm [-f | -force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [files]

[-f | -force]:强制删除,已经add并且工作区进行了修改,可加此参数。
[-n] :查询操作,仅会列出执行该命令后会删除那些文件,但不会真正执行该命令。
[-r]: 递归删除
[--cached]:从暂存区中删除文件索引,但工作区内容保存。此操作后,git将不再最终该文件
[--ignore-unmatch]:忽略未匹配的文件,删除未添加至暂存区的文件时不需要提示可进行直接删除。
[--quiet]:执行删除索引成功后不输出提示。删除的时不存在的文件索引仍然会提示。

4.16 branch

分支指令

git branch

4.17 status

状态指令
git status:将展示工作区及暂存区中不同状态的文件,比如已修改未暂存、已暂存未提交等。

5. 撤销操作

5.1 覆盖提交

提交过文件后发现有文件没有添加至暂存区(未add),或者修改提交信息可运行该指令

git commit --amend

说明:
  该命令是将暂存区文件进行提交并覆盖上一次提交的内容。即该命令仅能重置上一次提交,而不能进行隔代版本替换。

git commit -m 'initial commit'
git add forgetten_file
git commit --amend

注:上述命令只会有一个提交--第二次提交将会代替第一次提交的结果

撤销提交

撤销暂存、取消文件修改

   reset 可根据commit版本号来回滚暂存区,详情请查阅回到“4.13 reset”

5. 冲突解决

5.1 强制拉取

场景:忽略本地修改

git fetch --all   //远程 → 本地仓库
git reset --hard origin/dev  // 本地 → 暂存区
git pull  // 同步工作区、远程仓库

5.2 未commit先pull

本地修改量小

git revert   //取消本地修改代码
git pull   // 更新至最新代码
修改代码
git pull   // 确认无其他人在修改过程中提交代码
add、commit、push

本地修改量大,冲突较多

git stash save   // 将自己的代码隐藏
git pull   // 更新至最新版本
git stash pop   //取回隐藏的代码
解决冲突(经上步后,代码文件会显示冲突)
add、commit、push

5.3 已commit未push

本地修改量小

git reset   //回退至未修改状态
git pull   //获取最新代码
在最新代码上修改
git pull  //确认无其他人在修改过程中提交代码
add、commit、push

本地修改量大

git pull //显示冲突
手动merge → 解决冲突
add、commit、push

6 建立本地仓库与远程仓库追踪关系

查看分支追踪关系

git branch -vv

  dev    be1c962 [origin/master] a
  master 6577072 [origin/master: behind 1] .
* next   be1c962 [origin/next] a
  vv     021db27 第一次修改

追踪关系的建立主要有以下三种方式:1.手动建立、2.push时建立、3.新建分支时建立。
详细说明如下:
  ☆ 手动建立

git branch --set-upstream-to=<远程主机名>/<远程分支> <本地分支名>

  ☆ push时建立

git push <远程主机名> <本地分支>:<远程分支名>
or
git push -u <远程主机名> <本地分支>

注: -u :本地指定分支和远程主机的同名分支建立追踪关系

  ☆ 新建分支

git checkout -b <本地分支名> <远程主机名>/<远程分支名>

注:
  手动建立、新建分支的前提条件是远程分支已存在所要追踪的分支。
  push时建立是若所追踪的远程分支不存在则创建远程分支。

--- 未完

鸣谢

参考博文: https://zhuanlan.zhihu.com/p/25868120

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容