Contents

Git常用命令整理

Git常用命令整理.

Note
本文只包含对常用git命令的整理,后续会不定时更新……

ssh-keygen

1
ssh-keygen -t rsa -C "your email adress"

git config

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 配置用户名
git config --global user.name "your name"
# 配置用户邮箱
git config --global user.email "your email"
# 配置pull合并方式
git config --global pull.rebase false
# 查看全局配置
git config --global --list
# socks代理
git config --global http.proxy 'socks5://127.0.0.1:7890'
git config --global https.proxy 'socks5://127.0.0.1:7890'
# http代理
git config --global https.proxy 'http://127.0.0.1:7890'
git config --global https.proxy 'https://127.0.0.1:7890'
# 取消配置(例如取消代理配置)
git config --global --unset http.proxy
git config --global --unset https.proxy

git clone

1
2
3
git clone <repository>
# 递归拉取(一般用在仓库中有子模块的时候)
git clone --recursive <repository>

git branch

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看本地分支列表
git branch -l
# 查看远程分支列表
git branch -r
# 查看本地+远程分支列表
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch <branchname>
# 现有分支与指定的远程分支建立追踪关系
git branch -u <remote-branchname>
# 删除本地分支
git branch -d <branchname>

git add

1
2
3
4
5
# 添加所有变化
git add .
git add -A
# 添加被修改,被删除的变化,不包括新增的文件
git add -u

git checkout

1
2
3
4
5
6
7
8
# 切换到指定分支
git checkout <branch>
# 基于现有分支创建新分支,并切换至新分支
git checkout -b <branch>
# 基于远程分支创建新分支,并切换至新分支
git checkout -b <branch> <remote-branch>
# 恢复暂存区指定文件到工作区
git checkout <file>

git restore

1
2
3
4
# 丢弃工作区指定文件的变化
git restore <file>
# 丢弃工作区所有变化
git restore .

git commit

1
2
3
4
5
6
# 提交暂存区文件到仓库
git commit -m <message>
# 提交至上个commit
git commit --amend
# 提交至上个commit(包括工作区的内容)
git commit --amend -a

git tag

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 列出所有tag
git tag -l
# 查看tag信息
git show <tagname>
# 在当前commit新建一个tag
git tag <tagname>
# 在指定commit新建一个tag
git tag <tagname> <commit>
# 推送指定tag至远程仓库
git push origin <tagname>
# 推送所有tag至远程仓库
git push origin --tags
# 删除本地tag
git tag -d <tagname>
# 删除远程tag
git push origin :refs/tags/<tagname>

git status

1
2
# 显示所有变更的文件
git status

git log

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 显示所有提交过的版本信息
git log --graph
# 显示过去n次提交过的版本信息
git log -n
# 根据关键词搜索提交历史
git log -S <keyword>
# 显示某个文件的版本历史,包括文件改动
git log --follow <file>
# 显示暂存区和工作区的差异
git diff
# 显示两次提交之间的差异
git diff <commit1> <commit2>

git reflog

1
2
3
# 显示所有分支的操作记录,包括已经被删除的 commit 记录和 reset 的操作
git reflog
git reflog -n

git reset

1
2
# 回退至指定commit
git reset --hard <commit>

git push

1
2
3
4
5
6
7
8
# 推送本地分支至对应的远程分支
git push
# 推送本地分支至指定的远程分支,并建立追踪
git push -u origin <branch>
# 强制推送
git push --force
# 删除远程分支
git push origin --delete <branchname>

git pull

1
2
# 拉取远程仓库的变化,并与本地分支合并
git pull

git fetch

1
2
3
4
5
6
# 取回远程主机特定分支的更新 到 本地对应的远程分支
git fetch <remote> <branch>
# 创建并更新远程分支到本地远程分支。
git fetch
# 手动指定了要fetch的remote。在不指定分支时通常默认为master
git fetch <remote>
Warning
  • pull:拉取远程仓库的变化到本地远程分支,并本地分支合并
  • fetch:拉取远程仓库的变化到本地远程分支,但不与本地分支合并

git remote

1
2
3
4
# 显示所有远程仓库
git remote -v
# 把本地仓库和远程仓库关联
git remote add origin <repository>

git submodule

1
2
3
4
5
6
7
8
# 添加子模块
git submodule add <repository> <path>
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 拉取所有子模块
git submodule foreach git pull

git rebase

1
2
# 合并当前commit到指定commit的记录
git rebase -i <commit>
如何选择 git rebase 或 git merge ?

以下是2种合并方式的比较:

  • merge:使用简单,但每次合并时会生成一个新的合并点;merge操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add修改,commit就可以继续往下操作。
  • rebase:操作稍微复杂,会把你当前分支的 commit放到公共分支的最前面(靠近HEAD);rebase操作遇到冲突的时候会中断rebase,同时会提示去解决冲突。解决冲突后,将修改add后执行git rebase —-continue继续操作,或者git rebase —-skip忽略冲突。

一般推荐使用rebase,因为merge之后会有记录,然后在提交PR(Pull/Request)会很难看。

关于fork了别人的仓库,如何保持同步更新?
  1. 给fork配置一个remote
    • 使用git remote -v查看远程状态
    • 添加一个将被同步给fork远程的上游仓库(源名称一般建议upstream,可修改)
      1
      
      git remote add upstream <git address>
      
    • 再次通过git remote -v查看状态确认是否配置成功
  2. 同步至fork
    • 从上游仓库fetch分支和提交点,传送至本地,并会被存储在一个本地分支upstream/master
      1
      
      git fetch upstream
      
    • 切换到本地主分支
      1
      
      git checkout master
      
    • upstream/master分支合并到本地master上,这样就完成了同步,并且不会丢掉本地修改的内容
      1
      
      git rebase upstream/master
      
    • 最后一步git push origin master

强烈推荐使用rebase,因为merge之后会有记录,然后在提交PR(Pull/Request)会很难看。