Git 常用命令集合

初始化一个仓库

//创建版本库(仓库,其实就是一个目录)
mkdir fileName
cd fileName 
//把这个目录变成 git 可管理的目录 (文件夹下多了 .git 文件被隐藏了 < ls -ah 可见 >)
git init 
//操作 往fileName文件夹添加文件,添加了file1.txt , file2.txt 
//把修改添加到仓库
git add * / git add . / git add file1.txt /git add file1.txt file2.txt
//提交到仓库
git commit -m "说明这次提交做了什么操作!"

命令解释(官方)

git  init   ---Create an empty Git repository or reinitiallize existing one
git add  ---Add file contents to the index

一、GIT配置

git config --global user.name "your name"
git config --global user.email "mail@xx.com"
Git会按照你需要自动为大部分的输出加上颜色,你能明确地规定哪些需要着色以及怎样着色,设置color.ui为true来打开所有的默认终端着色。
git config --global color.ui true
Git默认会调用你的环境变量editor定义的值作为文本编辑器,如果没有定义的话,会调用Vi来创建和编辑提交以及标签信息, 你可以使用core.editor改变默认编辑器
git config --global core.editor vi
git config --global alias.别名 "指定代码"    设置alias,这样"别名"就是自己新的命令了
eg git config --global alias.mypuh "pull gitlab my_branch"  git mypush === git pull gitlab my_branch
git config -list   //列出所有git配置

二、命令

前言:
cd /path/to/my/codebase
git init      (1)  //Create a /path/to/my/codebase/.git directory.
git add .     (2)  //Add all existing files to the index.
git commit    (3)  //Record the pristine state as the first commit in the history.

** git add 详解
** git commit -m / -sm / -am 详解

- git status   //时刻掌握仓库当前的状态,告诉你有什么文件做了修改,是提交了还是未提交等信息
- git diff filename1   //查看filename1具体做了什么修改
  git diff *index.js   //查看以index.js结束的文件修改情况(路径)
  git diff || git diff . || git diff * //查看所有文件具体修改

- git log  命令显示从最近到最远的提交日志
  如下所示:
  commit cb926e7ea50ad11b8f9e909c05226233bf755030   //版本号
  Author: Michael Liao <askxuefeng@gmail.com>       //作者,就是config里设置的
  Date:   Mon Aug 19 17:51:55 2013 +0800            //该版本提交的时间
  
      wrote a readme file                           //每次commit的内容
  
  
  git log --pretty=oneline  
  3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
  ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
  cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

版本回退
HEAD 表示当前版本,也就是最新提交的版本
HEAD^
HEAD^^
HEAD^^^.....以此类推
HEAD~98 简单写法

- git reset --hard HEAD^  执行后,顺便把工作区的文件更新了
  回退之后,使用 git log 查看,HEAD 版本信息看不到了,如果后悔了怎么办?记得之前版本的Commit ID(不用全部记住,一部分就OK)就可以了,必须要知道COMMITID
  git reset --hard commitID
- git reflog 记录你的每一次命令,关机也可以记录COMMITID,所以关机之后也可以往前走一个版本

git reflog是从建库对这个版本的所有操作记录(一定是本地从clone之后开始记录)
git log 是这个版本的保留的操作记录,这样理解没错吧 (包括线上的原始记录)

概念:工作区 & 暂存区 & 版本库

工作区:就是一个目录,我们工作,都是在工作区内
工作区里面有个.git文件,这个不算工作区,这个是Git的版本库!
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

git diff    #是工作区(work dict)和暂存区(stage)的比较
git diff --cached    #是暂存区(stage)和分支(master)的比较

试验了一下才理解,stage或cache与虽说是暂存区,缓冲区,但commit并不是像想像那样把这个区清空,估计只是打个同步的标志,内容还在,就能理解了。

add 是 把工作区的更新到暂存区,commit是把缓冲区更新到仓库。所以经过add, commit,修改再add,再修改,就会出现工作区、缓冲区、和仓库三者都不同。

就可以下面的比较了:
git diff 是工作区和 中间区比较,git diff --cached是中间区和仓库比较。

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件
git diff HEAD -- readme.txt 命令可以查看工作区和版本库里面最新版本的区别

撤销修改
git checkout -- file(指的是相对路径)  : 工作区的修改全部撤销,回到修改之前的状态
一种是 file 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

那么如何把暂存区的修改撤销掉呢?
git reset HEAD file 暂存区修改撤销,重新放回工作区  
接着 git checkout -- file  就可以回到修改之前

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件:
工作区   ------>  暂存区 ------>  版本库
rm test.txt  删除了工作区的文件,与版本库不一致了怎么办?
git status
两种情况:
  1、把版本库中的文件也删除
      git rm test.txt
      git commit -m "remove test.txt"
  2、误删文件,找回来
      git checkout -- file  (git checkout 让暂存区和工作区同步,修改删除,都可以还原)

远程仓库:
远程新建一个仓库和本地已有仓库关联起来!
git remote add origin git@server-name:path/repo-name.git
//我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master

git clone git地址

branch control
git checkout -b dev   ====  ( git branch dev(创建) , git checkout dev(切换) )
-b 创建并切换

git branch  查看当前分支(当前分支会标上*号)


在dev分支修改之后,git checkout master , git merge dev 切换到master分支,再合并指定分支到当前分支

删除分支  git branch -d dev   git branch

解决矛盾:新建一个分支dev 做了修改并commit 切回到master分支,也做了修改并commit 
此时 git merge dev就会产生矛盾
修改之后
git add & git commit 

git log --graph 以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit  

no-ff参数代表合并的时候,保留记录,没有该参数,删除dev 后 ,则没有 dev 记录
git merge --no-ff -m "merge with no-ff" dev

git stash 存储现场 

    save working derectory and index state WIP on dev:6224973 add merge
    HEAD is now at 622437 add merge

技术总是跟随场景变化的!
总存在这样的情况,你的工作完成到一半没有add,没有commit,未完成的工作一般是不允许commit 否则容易出问题。保持原来可行版本永远是最优选择
忽然要修一个BUG ,很紧迫,怎么办?工作了那么多可不能丢啊   git stash保存现场吧
在主分支上开一个新分支 git checkout -b bug-01
修复bug 提交
合并 git merge --no-ff -m "xxx" bug-01
删除新开分支 git branch -d bug-01
回到以前的工作分区 git checkout dev
查看有多少现场 git stash list
只有一个现场 有两个选择:
git stash apply && git stash drop (删除现场,避免影响后面的工作)
git stash pop (恢复现场并且删除现场)
若有很多现场
stash@{0}:xxxxx
stash@{1}:xxxxx
stash@{2}:xxxxx
stash@{3}:xxxxx

git stash apply stash@{0}
git stash drop stash@{0}


git branch -D <name> 新分支没有合并时候,强行删除分支
删除远程关联
git remote remove origin || origin/dev || ...

查看远程库信息
git remote 
git remote -v(详细)

完整的操作
1/
git remote add origin git地址
git push origin(远程仓库)  dev(本地的dev分支)/anybranch
远程版本比你本地版本高
先pull,在push
git pull 提示no tracking information ,要先 git branch --set-upstream branch-name origin/branch-name
2/
git clone ssh_adress
git checkout -b <branch_name> origin/<branch_name>


标签一般记录版本(每升一个版本,可以打个标签,下次要看这个版本的时候,不用记住commitID,只要记住你打的标签即可!)
标签一打,不能修改(说的是不能再次修改标签指定的版本!)

打标签!:
1、切换到需要打标签的分支上
git branch
git checkout master
git tag v1.0
OK啦

2、查看所有标签
git tag
v1.0
v1.2
v2.0
v2.1
v2.2
.....

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息(其实也满足了语义化,标签不就是把一个版本进行语义化记录吗?)

git show v1.0
commitID
author
Date
  -m   
      information
....

-a 表示指定标签名 ,-m说明文字
git tag -a v0.1 -m "version 0.1 released" 3628164
git show v0.1

Tagger: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 26 07:28:11 2013 +0800

version 0.1 released

commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800

    append GPL

还可以通过-s用私钥签名一个标签:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:
如果报错,请参考GnuPG帮助文档配置Key。

how to handle tag?
删除标签
本地删除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>
推送远程
git push origin <tag_name>
一次性推送所有tag
git push origin --tags

pull request *
忽略特殊文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

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

推荐阅读更多精彩内容