做研发的朋友不可能不知道Git,Git在研发界里可谓是妇孺皆知。平时看到大佬都在流畅的敲命令行而你还在默默地使用可视化工具,是不是瞬间感觉自己弱爆了。今天来列出一些使用频率较高的Git命令,掌握它其实你也可以拥有敲命令行的快感......
init & clone
1、git init project_name
#初始化本地git仓库,会在project_name下生成.git文件夹
2、git clone url(ssh/https) project_name
#从远程克隆已有的项目到本地project_name目录
3、git add .
#将当前目录下的所有新增加的和修改的文件,不包括已删除的文件添加到暂存区
4、git add file_name
#将文件file_name添加至暂存区, 文件名以空格分开可添加多个文件
5、git add -A
#添加所有新增加的和修改的和已删除的文件至暂存区
5、git add --all
#添加所有新增加的和修改的和已删除的文件至暂存区
6、git add -p fileName(选择E,打开编辑器去掉不需要的部分)
#只提交一个文件的一部分内容
mv & rm
1、git mv fileName newFileName
#文件重命名
2、git rm fileName
#删除暂存区和工作区里的文件
3、git rm --cached || rm .git/index
#只删除暂存区里的文件
reset & checkout
1、git reset --hard HEAD || commitId
#此撤销不会在历史记录中找到,就好像没有提交一样(git reflog才可查看记录)
--mixed: (默认值) 暂存区的内容会被撤销的版本内容覆盖,工作区不会被覆盖
--soft: 暂存区和工作区的内容不会被撤销的版本所覆盖,内容保持原样
--hard: 暂存区和工作区的的内容都会被撤销的版本所覆盖
#只跟踪被修改的文件
git push -f origin master
#如果撤销的版本已经同步到远程分支,那么撤销后再次同步到远程分支会提示当前提交晚于远程的版本,提交不成功,需要强制推送到远程版本,(此操作很危险,如果远程版本已经被别人同步过,强制推送会出现数据丢失的情况)
2、git checkout HEAD fileName (commit => index => workplace)
#暂存区和工作区均被覆盖
3、git revert -n commitId
#此撤销会生成新的提交,撤销版本后面的版本依然保留
4、git checkout -- fileName
#从暂存区中撤销覆盖工作区的内容
5、git chekout -b dev origin/dev
(git checkout -t origin/dev)
(git checkout --track origin/dev)
#拉取远程dev分支到本地
diff
1、git diff commitId fileName
#对比工作区和提交差异
2、git diff fileName
#对比工作区和暂存区的差异
3、git diff --cached fileName
#对比暂存区和版本库的差异
4、git diff head fileName
#对比工作区和版本库的差异
5、git diff --stat
#统计新增和删除了多少行
6、git diff --numstat
#统计具体新增和删除了哪一行
clean
1、git clean -f
#清除工作区的文件
2、git clean -d
#清除工作区的目录
blame
1、git blame fileName
#查看一个文件里谁修改了什么东西
commit
1、git commit -am "强制提交,跳过暂存区"
#强制提交,跳过 add不包含新增的文件,提交后暂存区里有记录
2、git commit --amend -m "编辑上一次提交"
#编辑上一次提交,会生成新的提交记录
3、git commit -m "暂存区提交到本地仓库"
#将暂存区里的内容提交至本地仓库,(只提交暂存区里的内容)
4、git commit --allow-empty -m "允许空提交"
#允许空内容提交,会有新的提交记录
branch
1、git branch -f newBr
#强制新建分支覆盖原有分支
2、git checkout -B newBr
#强制新建并切换到新分支
3、git branch --remote
#查看远程分支
4、git branch -m oldBr newBr
#分支重命名
5、git checkout -b newBr commitId
#基于某次提交创建新分支
6、git stash branch newBr
#基于存储建立新分支
7、git reflog show --date=iso master
#查看分支创建时间
8、git branch -d branch1 branch2
#同时删除多个分支
9、git branch -D branch
#强制删除分支
10、git branch(cat .git/HEAD)
#查看当前分支
11、git fetch -p
#移除远程仓库上不存在的分支
12、 git merge newBr
#将newBr分支合并到当前分支
快进(fast-forward):当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧
合并提交:当两个分支相对于共同的祖先有了多次的提交,合并时会生成新的提交,它的有两个父节点
合并冲突:当两个分支对同一文件同一地方做了不同的修改,合并时就会产生冲突,此时两个分支合并了,但是没有合并提交,需要手动去解决冲突再手动提交(此时会出现未合并状态的文件,解决完冲突后使用git add 冲突的文件名 来标记已解决的冲突)
13、git branch -v
#查看每个分支的最后提交
--merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支
14、git fetch
#从远程拉取本地没有的数据,它不会影响工作区的内容,会让你自己合并
15、git pull(git fetch + git merge)
#从远程拉取本地没有的数据,同步工作区暂存区的内容
16、git push origin --delete dev
#删除远程分支
17、git rebase master
(git rebase master(目标分支) experiment(主题分支))
git checkout master
git merge experiment
#变基,将当前experiment分支并到master分支上,然后切换到master分支上,进行合并
merge是通过三方合并(c2\c3\c4),最终生成新的提交:
merge和rebase合并的结果没有什么区别,但是rebase使得整个过程更加整洁,没有看到历史分叉
变基的风险:
变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟
log
1、git log
#不带参数默认会按先后顺序列出所有提交
2、git log -p (git log --patch)
#列出每次提交引入的差异,按补丁的格式展示
3、git log -n
#按条数输出提交记录
4、git log --stat
#列出每次提交的粗略统计信息
5、git log --pretty=子选项
--oneline:提交按一行显示
--format:自定义格式化输出,其格式化参数如下:
6、git log --graph
#选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史
stash
1、git stash save "储藏编辑过的文件"
#修改当前分支到一半的时候,突然想还原,就可以将它储藏起来,只对修改的文件生效
2、git stash list
#查看储藏列表
3、git stash apply
#应用最新的储藏内容,使用后仍然存在于历史记录中
4、git stash pop
#应用最新的存储藏内容,使用后并在历史记录中删除掉
5、git stash drop
#删除最新的储藏
cat-file
1、git cat-file -t commitId
#查看此次提交的具体git对象
2、git cat-file -p commitId
#查看git对象具体信息
3、wc -l fileName
#查看文件行数
grep
1、git grep -n www
#检索哪一行有www
2、git grep --name-only www
#检索文件名是否有www
3、git grep -c www
#统计文件中有几行出现www
其他
git log -p
#查看历史具体信息
git reflog
#获取所有操作历史,包括撤销的提交
git show -s
#查看提交信息
git ls-files --stage
#查看暂存区的内容
rm -fr .git
#清空版本库
git hash-object fileName
#查看文件对应的hash值
git cherry-pick commitId
#两个分支做相同的提交
想看更多内容,请关注我的公众号: