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就会自动忽略这些文件。

配置别名

推荐阅读更多精彩内容