git 常用命令

2020-09-06 by 杜宏伟

git常用命令整理一下,便于查看。

创建仓库

创建远程仓库

可以在github这样的平台上创建,也可以在本地创建

git init --bare music.git

从远程仓库clone

clone命令会自动建立本地与远程仓库的连接,后面修改文件后可以直接拉取和推送

clone命令具体做了哪些事呢?我们可以从一个空文件夹开始。

mkdir music
cd music
git init
echo 1 > a.txt
git add a.txt
git commit -m 1
git push

推送的时候失败了,因为git不知道哪里推送

git push /home/dhw/tmp/a.git/ master`

这回成功了。写全了应该是

git push /home/dhw/tmp/a.git/ master:master`

每次都把仓库地址写全挺麻烦的,可以给远程仓库地址起个名字,下次直接写名字即可

git remote add origin /home/dhw/tmp/a.git/`

现在可以这样推送了

git push origin master

每次都写origin master也挺麻烦的,可以加配置来省略 告诉git用simple的方式来处理 这是git 2.0的默认情况,可以不用写这个配置,但是如果你的git还没到2.0,比如1.8.3.1中,就会发出警告,说以前默认值是matching,新版会用simple,所以需要把这个配置写一下,以免将来升级后出现不符合预期的情况。

git config --global push.default simple

但是执行git push origin 的时候还是不行,因为远程分支和本地分支没有跟踪,所以还需要跟踪一下

因为第一次提交的时候同名的远程分支还不存在,所以需要在push的时候做跟踪,后面就可以直接 push的了,


# push的时候做跟踪
git push --set-upstream orgin master
git push -u origin master
git br -u origin/master master #远程分支存在

分支

一般来说,开发的时候可以用总分总的模式,master分支是主干,和线上保持一致辞。有新需求的时候打一个分支出来,开发完成合并到主干。

对于特别复杂的需求可以用主管,副主管的模式。

# A 同学创建分支,并推送到远程
git branch dev
# 注意需要 push.default 配置的是 simple,不然应该先切换把dev分支
# 推送到远程,并建立本地dev与 origin dev的跟踪
git push -u origin dev
# B 同学拉取分支,git fetch也行
git pull
# 建立本地dev分支并建立跟踪
git checkout -b dev orgin/dev
# 或用更简洁的命令,git会帮你做好一切事情
git checkout dev

如果是一个小需求,是不需要共享分支的,只保留在本地即可。

分支常用命令

# 查看本地分支
git branch 
# 查看所有分支(本地与远程)
git branch -a 
# 查看远程分支
git branch -r 
# 查看本地分支与远程分支之间的关联关系
git branch -vv 
# 切换到上一个分支
git checkout - 
# 删除远程分支,本地远程支,本地分支
git push origin --delete [branch-name] 
git branch -dr [remote/branch]
git branch -d [branch-name]
# 列出远程分支,从服务端检出
git ls-remote

查看历史

# 搜索提交的文件的内容的历史,根据关键词
git log -S [keyword]
# 查看文件列表和变更状态,--最好写上,不然可能会被当成分支处理
git log --name-status -- [file]
# %C(yellow) 黄色,%h 短hash,an,authorname,ar 短日期
git log --pretty=format:'%C(yellow) %h %Creset %an %ar'
# 查看某个提交之前的历史,包含这个提交
git log [commit]
git log HEAD^
git log HEAD~3
# 显示过去5次提交,--pretty后面什么也不写也会有格式化的作用
git log -5 --pretty --oneline
# 查看某个提交之后的提交,不包含这个提交,后面加两个.
git log [commit]..
# 查看某段提交 
git log [commit]..[commit]
# 检索提交的message
git log [tag] HEAD --grep feature
# 检索历史,包含重命名
git log --follow [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 查看tag,分支,HEAD都在什么地方
git log --decorate --oneline
# 提交的hash简写
git log --abbrev-commit
# 简短时间显示
git log  --relative-date
# 本地时间显示
git log  --date=local
# 按作者显示
git log --author=authorname
# 输出给管道等时也带颜色,也可以在配置文件中 color.ui always
git log --color
#图形显示,--all如果没有只显示当前分支
git log --graph --all --oneline
#忽略merges提交
git log --no-merges

diff与show

# 显示暂存区和工作区的差异
git diff

# 显示暂存区和上一个commit的差异
git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
git diff HEAD

# 显示两次提交之间的差异 ..可以省略,可以是三个点,
# 表示自两个分支开发以来的差异,主干的差异不算
git diff [first-branch]..[second-branch]
# 查看某次提交的文件内容 冒号分隔
git show [commit]:src/js/danmu/text.js
# 查看某次提交的文件 diff 没有冒号
git show [commit] src/js/danmu/text.js

撤销

还没有暂存

# 注意 -- 前面后面要有空格,-- 是必须的。
git checkout -- [file]
## 检出所有,慎用
git checkout .

已经暂存,但还没有 commit

git reset HEAD [file]
git checkout -- file
# 也可以一步到位,这样相当于强制恢复到HEAD提交时的状态
git reset --hard HEAD [file]

已经commit

# 只是移动头指针到上一次提交,并从暂存区移除,但文件还在
git reset HEAD^
# 一步到位
git reset --hard HEAD^
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]

暂时将未提交的变化移除,稍后再移入

git stash
git stash pop

指针回退后又后悔了

git reflog

修改上一次提交

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

还有 rebase, filter-branch 可以用来修改历史,这个知道就行了。

标签

标签分两种,一般用轻型的就行,另一种就是附加了各种信息

git tag
git tag [tag]
# 新建一个tag在指定commit
git tag [tag] [commit]
# 删除本地tag
git tag -d [tag]
# 删除远程tag
git push origin --delete [tagname]
# 查看tag信息
git show [tag]
# 提交指定tag
git push [remote] [tag]
# 提交所有tag
git push [remote] --tags
# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]
# 生成一个可供发布的压缩包
git archive

我叫杜宏伟,前端开发。

一直想写博客,在2018的年的最后几天,终于上线了。

对于前端开发,一个特点就是太零散,很容易会了后面忘了前面,所以归纳总结很重要。再有就是分享,做前端好多年,以前都是看你们写的文章, 现在我也开始写一些,希望可以帮到入行的小伙伴。微信号 duhongwei5775

欢迎转载,只需注明作者,出处即可

版权说明:署名 4.0 国际(CC BY 4.0)