[TOC]

0x00 git常用命令

WeiyiGeek.git常用命令一览

config
#git中文路径显示乱码,当被修改的文件中有中文字符时,中文字符会被转换为unicode码,导致看不出来原来的文件名。
git config --global core.quotepath false #不会对路径进行转换,显示原来完整的中文路径(非常重要)

#常用的别名设置
$ git config --global alias.[别名名称] [原git命令] #别名设置
$ git config --global alias.st status
$ git config --global alias.co checkout #用co表示checkout,ci表示commit,br表示branch:
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1' #配置一个git last让其显示最后一次提交信息
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"


#常用的:
gapa git add --patch
gc! git commit -v --amend
gcl git clone --recursive
gclean git reset --hard && git clean -dfx
gcm git checkout master
gcmsg git commit -m
gco git checkout
gd git diff
gdca git diff --cached
gp git push
grbc git rebase --continue
gst git status
gup git pull --rebase

0x01 常用命令详情

clone

描述:克隆仓库会下载仓库完整的文件、分支和历史记录。

git clone [<options>] [--] <repo> [<dir>]

# 克隆完整的仓库到 ./git-learning 目录下
git clone [email protected]:x-cold/git-learning.git
# 只克隆 dev 分支到 ./dev 目录下
git clone -b dev [email protected]:x-cold/git-learning.git dev


add

描述:用命令git add告诉Git,把文件添加到暂存区注意,可反复多次使用,添加多个文件;

#git add 常用命令
$ git add readme.txt app/ index.js #添加指定文件
$ git add -A #添加所有改动
$ git add * #添加新建文件和修改,但是不包括删除
$ git add . #添加新建文件和修改,但是不包括删除
$ git add -u #添加修改和删除,但是不包括新建文件
$ git add -f App.class #强制添加被.gitignore忽略了的文件到暂存区里
#执行git命令没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。


commit

描述:,用命令git commit告诉Git,把文件提交到本地仓库;

#修改当前的 commit message
$ git commit --amend
$ git commit --amend --author='Author Name <[email protected]>' #修改作者名

#最普通的提交-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的这样你就能从历史记录里方便地找到改动记录。
$ git commit -m "wrote a readme file"

#重置当前的 commit author 和 message
$ git commit --amend --reset-author


push

描述:将本地代码仓库推送到远程代码仓库之中;

#指定远程仓库名称与分支名称推送信息
git push origin master # 提交本地仓库当前分支到远程仓库的 master 分支
$ git push -f origin master # 强制推送
$ git push -u origin master
$ git push --set-upstream origin master #将远程仓库设置为从“origin”跟踪远程分支“master”进行关联

# 提交本地仓库 dev 分支到远程的 master 分支
git push origin master:dev


#推送标签到仓库
git push origin v1.0 #可以推送一个本地标签 (单个 tag)
git push origin --tags #推送全部未推送过的本地标签

#删除远程分支
git push origin --delete <remote_branchname>
git push origin :<remote_branchname>
$ git push --delete origin master
$ git push origin <格>:master


pull

描述:从远程仓库拉取代码库

$ git pull  #相当于fetch/merge->取回远程的仓库再与本地的制定分支合并)

# 通常来说,默认的 pull 行为等同于 git fetch + git merge
# 下面这行命令等同于 git fetch origin master && git merge origin/master
$ git pull origin(远程源名称) master(分支名称)

# 也可以通过变基的方式来拉取代码,这样分支模型不容易受到影响
# 下面这行命令等同于 git fetch origin master && git rebase origin/master
$ git pull --rebase origin master #rebase 复位基底


log

描述:利用命令git log查看Git,把文件提交到远程仓库的历史,进行显示;在实际工作中我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么

$ git log  #显示从最近到最远的提交日志
# commit 150030c770fa7675d77fc814d2310cd568858492
# Author: Weiyigeek <***@qq.com>
# Date: Mon Apr 10 15:11:26 2017 +0800
# test github


$ git log --pretty=oneline #简约输出历史
$ git log --color --graph --pretty=oneline
# * 890adeeddf59263d063e1406fd382ef6086b177c (HEAD -> master, origin/master) www
# * 2efdfc9011eb2b3c28071ff63e8db06af453b624 testa


#提交说明与commitid
$ git log --oneline
$ git log --oneline --decorate --graph
# 75b5b8 (HEAD -> master, origin/master, origin/HEAD) git study
# c1ee2c4 all
# 5a0c6df shell
# 83055b1 shell
# e6598b0 1
# 0c8a94e Python数据处理


#查看指定版本的提交记录
git log HEAD^ #上一个
git log HEAD^^ #上上个
git log HEAD~3 #上三个版本的历史


#查看指定数量的log日志
git log -1
# commit 890adeeddf59263d063e1406fd382ef6086b177c (HEAD -> master, origin/master)

$ git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
$ git log --graph --pretty=oneline --abbrev-commit #--graph看到分支合并图
# * 59bc1cb conflict fixed
# |\
# | * 75a857c AND simple
# * | 400b400 & simple
# |/

WeiyiGeek.git-log


status

描述:让我们时刻掌握仓库当前的状态,方便开发者进入下一步操作;

$ git status


diff

描述:对比不同工作区里面的不同版本,虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。
比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

$ git diff HEAD -- readme.txt #查看工作区和版本库里面最新版本的区别
$ git diff #输出工作区和暂存区的different(不同)。
$ git diff HEAD #输出工作区、暂存区 和本地最近的版本(commit)的different(不同)
$ git diff --cached <HEAD^1 / Commit ID> #输出暂存区和本地最近的版本(commit)的different(不同)
$ git diff master origin/master #本地仓库与origin/master就是你的远程仓库的different(不同)
$ git diff --color-words #显示差异的不同颜色单词的
$ git diff --word-diff #详细展示一行中的修改

#来确认代码自动合并的情况
git diff -w [files]


reset

描述:既可以回退版本,也可以把暂存区的修改回退到工作区。撤销提交更改,非常强大,我们用HEAD时,表示最新的版本。

#(1)在 commit 前撤销 add 或者修改
git reset #unstage all due changes
git reset <file> #撤销提交单独文件
git reset HEAD file #可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset --hard HEAD^ #同一提交的所有内容都会变回上一个Commit时的状态
git reset --hard commitID #回退或者前进到某一提交版本


checkout

描述:可以进行分支管理与撤销文件在工作区里面的更改;

#将 index.js 恢复到当前 commit 的内容
git checkout index.js
git checkout -- readme.txt #把readme.txt文件在工作区的修改全部撤销

#创建一个dev分支并切换到dev分支上
git checkout -b dev # Switched to a new branch 'dev'


#采用 - 快速切换分支/切换指定分支
$ git checkout -
$ git checkout dev


#从stash中拿出某个文件的修改
git checkout <[email protected]{n}> -- <file_path>


branch

描述:创建并查看分支

#查看分支会列出所有分支,当前分支前面会标一个*号。
$ git branch
* dev
master

#列出本地和远程分支
​$ git branch -a #-a参数相当于:all
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master


#列出远程分支
$ git branch -r #-r参数相当于:remote
​origin/HEAD -> origin/master
origin/master


#展示所有的分支关联的远程仓库
git branch -vv

#关联之后git branch -vv就可以展示关联的远程分支名了,同时推送到远程仓库直接:git push也不需要指定远程仓库了。
git branch -u origin/mybranch
git branch --set-upstream <localBranch> <remote>/<remoteBranch> #设置默认上游及分支
git branch --set-upstream dev origin/dev

#创建分支
$ git branch dev #创建dev分支
git branch feature/canvas dev # 基于远程仓库的 dev 分支,创建本地仓库的 feature/canvas 分支

#更名分支
git branch [<options>] (-m | -M) [<old-branch>] <new-branch>
$ git branch -m master
# 修改 feature/canvas 分支名为 feature/canvas2
git branch -M feature/canvas feature/canvas2

#删除本地分支
git branch -d <local_branchname>

#强行删除分支(要丢弃一个没有被合并过的分支)
$ git branch -D dev


fetch


merge

描述:合并分支

#合并某分支到当前分支
git merge <branchname>
git merge origin/master # 合并远程仓库的 master 分支到当前分支

#中止当前正在进行的合并
git merge --abort <branchname>


#禁用Fast forward(快进)合并分支
git merge --no-ff -m "merge with no-ff" dev #注意--no-ff参数,并且使用-m来生成一个commitid


stash

描述:把当前工作现场“储藏”起来,等一番 git 操作(比如 merge / rebase 等)之后,再将这部分更改重新放回工作:

# 临时存放,临时存放区是一个栈的结构,支持多次临时存放,遵循后入先出的原则
$ git stash #保存工作现场
$ git stash -u #保存当前状态包括untracked的文件
# Saved working directory and index state WIP on dev: 6224937 add merge
# HEAD is now at 6224937 add merge

#查看保存的工作现场查看
$ git stash list
# [email protected]{0}: WIP on dev: 6224937 add merge

# 重新放回到工作区
$ git stash pop
$ git stash pop --index [email protected]{0} #会回到工作区和暂存区

#保存本修改与暂存区的信息
$ git stash save -a "stash one"

#还原暂存区,可以恢复指定的stash
$ git stash apply --index [email protected]{0}

#删除暂存区
$ git stash drop --index [email protected]{0}

#删除所有的stash
git stash clear


tag

描述:为每一个或者指定的commitid提供标签信息;

#用命令git tag查看所有标签:
$ git tag
v1.0

#敲命令`git tag <name>`就可以打一个新标签
git tag v1.0 #默认标签是打在最新提交的commit上的。


#如果在commit之后要为某一个COMMITID打上标签
git tag v1.1 6a5819e


#设置一个COMMITID带说明的标签信息
git tag -a v0.1 -m "version 0.1 released" 3628164


#通过-s用私钥签名一个标签
git tag -s v0.2 -m "signed version 0.2 released" fec145a

#可以删除打的标签
$ git tag -d v0.1
Deleted tag 'v0.1' (was e078af9)

#删除远程 tag
git push origin :refs/tags/v1.0.0


remote

描述:远程仓库的管理与查看,remote 指的是本地的 git 仓库关联的远程 git 仓库。

#查看远程仓库
$ git remote #origin
$ git remote -v #查看详细分支
origin [email protected]:WeiyiGeek/test.git (fetch)
origin [email protected]:WeiyiGeek/test.git (push)

#修改远程仓库的url
$ git remote set-url origin <URL>

#进行更改远程源仓库名称
$ git remote rename origin test

#添加远程仓库
git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>
git remote add origin [email protected]:x-cold/git-learning.git

#删除远程仓库
git remote remove <name>
git remote remove origin #移除名字为 origin 的远程仓库

#删除一个test的远程仓库
$ git remote rm test


show

描述:进行commit提交修改查看以及标签信息查看;

git show <tagname> #查看标签信息
git show HEAD #查看当前本地指向
git show master #查看当前本地Master分支指向
git show origin/HEAD #查看当前远程指向
git show origin/master #查看当前远程Master分支指向


rebase

描述:变基是一种常用且有风险的操作,会改变提交历史,谨慎使用!

git rebase
while(存在冲突) {
git status #找到当前冲突文件,编辑解决冲突
git add -u
git rebase --continue
if( git rebase --abort )
break;
}


cherry-pick

描述:魔法级的命令cherry-pick 可以提取 N 个的提交记录,合入稳定版本的分支上
git cherry-pick []

# 挑选 371c2 单个提交记录,合入当前分支
git cherry-pick 371c2
# 挑选出 371c2 到 971209 的所有提交记录,并合入当前分支
git cherry-pick 371c2…971209


whatchaged

描述:查看指定时间段之间的改动

git whatchanged --since='2 weeks ago'  #查看两个星期内的改动


reflog

描述:Git提供了一个命令git reflog用来记录你的每一次命令,主要用来进行回退版本到未来;

$git reflog
2efdfc9 (HEAD -> master, origin/master) [email protected]{0}: initial pull


rename

描述:重命名仓库

git rename fork forked


rm

描述:删除文件

#从版本库中删除该文件
git rm test.txt

#只删除暂存区里的文件
git rm --cached test.txt


mv

描述:移动项目

$ git mv readme.txt ./TETS/


clean

描述:清除文件
参数说明:

x  -----删除忽略文件已经对git来说不识别的文件
d -----删除未被添加到git的路径中的文件
f -----强制运行

实际案例:

$ git clean        #清除没有加入暂存区的文件
$ git clean -n #不删除gitinore里面规则包含的文件
$ git clean -n -X #显示在工作区在.gitinore规则包含的文件
$ git clean -x -f #删除上面的所有文件,不管包括或者不包括
$ git clean -X -f #删除工作区在.gitinore规则包含的文件 大写的x
$ git clean -d -fx "" #删除未被添加到git的路径中的文件


revert

描述:产生覆盖文件

git revert  #产生新的提交覆盖以前的提交


ls-files

描述:查看仓库中所有的文件

#添加指定文件
git ls-files src/ | grep '\.css$' | xargs git add

#批量更换文章中的URL
git ls-files | grep "微服务浅谈与原理.md" | xargs sed "s#https://xxxx.com#http://baidu.com#g"