Git常用命令总结

1,899 阅读10分钟

配置操作

全局配置

对全局用户的所有仓库有效(最常用)
git config --global user.name '你的名字'  
git config --global user.email '你的邮箱'

对当前仓库用户有效(不常用)
git config --local user.name '你的名字'
git config --local user.email '你的邮箱'

对系统所有用户有效(根本就不用)
git config --system user.name '你的名字'
git config --system user.email '你的邮箱'


--------------------------例如--------------------------

git config --global user.name 'lvpeng'
git config --global user.email 'lvpeng1229@gmail.com'


清除设置

git config --unset --global 要删除的全局配置项
git config --unset --local  要删除的当前仓库配置项
git config --unset --system 要删除的系统配置项

--------------------------例如--------------------------
git config --unset --global user.name
git config --unset --global user.email

查看配置

git config --list           查看当前配置
git config --list --global  查看全局配置
git config --list --local   查看当前仓库配置
git config --list --system  查看系统配置项


初始化仓库

cd 项目代码所在的文件夹
git init

建立客户端与远程服务端的连接

git remote add origin 远程仓库的地址

--------------------------例如--------------------------
git remote add origin git@server-name:path/repo-name.git

连接建立完成之后,把本地代码推送到服务端

我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以去掉 “-u” 简化命令执行了。

git push -u origin 本地分支名

--------------------------例如--------------------------
git push -u origin master

本地操作

查看变更情况

git status

git add , git add -A , git add -u (详情见下面的链接)

git add .   git add -A   git add -u

git add .与git add -A的区别(版本不同时候的区别)

将指定文件添加到暂存区

git add 文件1 文件2 文件3

直接将修改后的文件提交到本地仓库

git commit -a -m "说明信息"   或者   git commit -am "说明信息"

变更文件名

git mv 原文件名 新修改后的文件名

查看当前目录下的所有文件

ls -al 

比较工作区和暂存区的所有差异

git diff

比较某个文件在工作区和暂存区的差异

git diff 文件

比较暂存区和 HEAD 的所有差异

git diff --cached

比较某个文件在暂存区和 HEAD 的差异

git diff --cached 文件

比较某文件工作区和 HEAD 的差异

git diff HEAD 文件

查看所有提交记录

git log

查看显示就近的 n 个 commit

git log -n

当前分支 commit 用一行显示,该命令会使commitID变的简短

git log --oneline
  
或者  

git log --pretty=oneline --abbrev-commit 

当前分支各个 commit 用一行显示,commitID 比较长

git log --pretty=oneline

查看commit之间的父子关系

git log --pretty=raw 
git log --pretty=raw --abbrev-commit   //缩短commitId

可以看到分支合并图

git log --graph --pretty=oneline 

显示所有本地和远程的所有提交记录

git reflog

查看所有分支的历史

git log --all 

查看图形化的 log 地址

git log --all --graph

查看所有图形化的 log 地址,commitId变短

git log --oneline --graph --all

查看最近的四条简洁历史

git log --oneline -n4

查看所有分支最近 4 条单行的图形化历史

git log --oneline --all -n4 --graph

某文件各行最后修改对应的 commit 以及作者 (没鸡毛用)

git blame 文件 

用 difftool 比较任意两个 commit 的差异

git difftool commitId1 commitId2 

git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示最新的版本。


将暂存区和工作区所有文件回退到和 HEAD 一样

git reset --hard

将暂存区和工作区所有文件回退到指定的某个提交点的版本(版本穿越)

git reset --hard commit_id

如果不知道commitID,可以使用git reflog查看

回退到上一个版本

git reset --hard HEAD~1
git reset --hard HEAD^(上一个版本)
git reset --hard HEAD^^(上上个版本)

对于几个区域的操作:

  1. 工作区 --> 暂存区 :git add
  2. 暂存区 --> 本地仓库 :git commit
  3. 暂存区 --> 工作区 :git reset HEAD fileName || git restore --staged fileName

将保存在暂存区中的所有文件踢回到工作区中

git reset HEAD

撤销修改:情况一,在工作区中发生了修改,但是还没提交到暂存区(没有add和commit)

git checkout -- fileName
或者(二者效果等同)
git restore fileName

撤销修改:情况二,已经添加到了暂存区,但是还没有提交(已add,还没有commit)

1、将保存在暂存区中的文件踢回到工作区中 
git reset HEAD fileName
或者(二者效果等同)
git restore --staged fileName


2、随后还要恢复已有内容:
git checkout -- fileName
或者(二者效果等同)
git restore fileName

查看哪些文件没被 Git 管控

git ls-files --others

将当前分支暂时挂起

git stash

恢复挂起的工作区

1、分步完成:
git stash apply  恢复暂时挂起的工作区
git stash drop   清除暂时挂起的工作区

2、一步完成 
git stash pop 从暂挂区中恢复工作区后删除暂挂区

查看当前挂起的分支

git stash list

取回某次 stash 的变更,然后删除

git stash pop stash@{数字n}

取回某次 stash 的变更

git stash apply stash@{数字n}

删除某次 stash 的变更

git stash drop stash@{数字n}

修改最后一次提交信息

git commit --amend

该命令会进入vim模式
1、按 “i” 键进入编辑模式。会在终端的左下角出现 ”-- NSERT --” 字样。
2、修改提交信息。
3、按 “ESC” 键退出编辑模式。
4、输入法切换到英文状态下,输入 “:wq”,保存并退出。

修改历史版本中某次提交信息

本案例中是想修改 e35d8b3 加入网络请求 这个提交记录。操作如下:

1、查询提交记录

git log --oneline

image.png

2、git rebase -i 要修改的commitId的父亲commitId。这里的 commitId 就应该是 a05a00e

git rebase -i a05a00e

3、然后会弹出进入vim模式,按“i” 进入编辑模式。目的是修改策略,将第一行修改为 r 后。按 "ESC" 退出编辑模式,输入 “:wq” 后保存并退出。

image.png

4、回车后,再次进入 vim 编辑模式操作,在该窗口中修改提交记录

image.png

5、再次回车,修改成功!

image.png

把连续多个commit整理成一个

// TODO

把不连续多个commit整理成一个

// TODO

选择一个commit,合并进当前分支

git cherry-pick commitId

文件删除恢复操作

  1. 在磁盘中删除了某个文件,然后执行了add&commit 操作,则分支上的文件就彻底没有了。此时如果认为该文件删错了,则使用版本穿越的方式进行恢复。以上操作是:删除已经被提交的操作,然后恢复回来。
git reset --hard commitID
  1. 如果没有add和commit,可以按照撤销修改:情况一方式处理

  2. 如果已经add,并没有commit,可以按照撤销修改:情况二方式处理

比较某文件两次不同提交的差异

git diff <commit_id1> <commit_id2> -- <file_name>

--------------------------例如--------------------------
git diff 8740378 303df3b -- app/src/main/java/com/kugou/MainActivity.java

比较某文件两个不同分支的差异

git diff <branch_1> <branch_2> -- <file_name>

--------------------------例如--------------------------
git diff master dev -- app/src/main/java/com/kugou/MainActivity.java

删除文件,这种方式是同时删除工作区和暂存区的文件

git rm 文件名

--------------------------例如--------------------------
git rm app/src/main/java/com/kugou/MainActivity.java

分支操作

建立追踪关系,在现有分支与指定的远程分支之间

git branch --set-upstream [本地分支] [远程分支]


--------------比如----------------
git branch --set-upstream master origin/master

上面命令指定`master`分支追踪`origin/master`分支。

创建分支(基于当前分支)

git branch 分支名

切换到指定分支

git checkout 分支名
或者
git switch 分支名

创建并且切换分支

git checkout -b 分支名
或者
git switch -c 分支名

创建并且切换远程分支

1、首先查看有哪些远程分支
git branch -a

2、创建并切换到远程分支
git checkout -b (switch -c) 本地分支名 origin/远程分支名
eg:git switch -c qs_master origin/qs_master

基于指定分支创建新分支

git branch 新分支 指定分支

基于某个 commitId 创建新分支

git branch 新分支 某个commitId

删除分支

在删除分支之前,首先要切换到其他分支,然后执行下面的命令才能执行成功
git branch -d 分支名

强制删除分支

在删除分支之前,首先要切换到其他分支,然后执行下面的命令才能执行成功
git branch -D 分支名

查看当前分支

git branch       // 只显示分支名
git branch -v    // 显示分支名和最后一次提交记录

查看本地和远程分支

git branch -a     // 只显示分支名
git branch -av    // 显示分支名和最后一次提交记录

查看远程分支

git branch -rv

将A分支合并到当前分支并且为此次合并创建commitId

首先要切换到当前分支,然后才可以执行下面的命令合并A分支。不可以在A分支上mergeA分支
git merge A分支 

将 A 分支合入到 B 分支中且为 merge 创建 commitId

git merge A分支 B分支

将当前分支(bugfix)基于B分支(feat)做 rebase,以便将B分支(bugfix)合入到当前分支

前   提:当前分支为feat,想要把bugfix分支变基到feat上。
操作步骤:切换到bugfix分支(git checkout bugfix),然后执行(git rebase feat)
git rebase B分支

将 A 分支基于 B 分支做 rebase,以便将 B 分支合入到 A 分支

git rebase B分支 A分支

标签操作

查看已有标签

git tag

新建标签

git tag v1.0

新建带备注标签

git tag -a v1.0 -m '前端食堂'

给指定的 commit 打标签

git tag v1.0 commitId

推送一个本地标签

git push origin v1.0

推送全部未推送过的本地标签

git push origin --tags

远端交互

查看所有远端仓库

git remote -v

添加远端仓库

git remote add url

删除远端仓库

git remote remove remote的名称

重命名远端仓库

git remote rename 旧名称 新名称

将远端所有分支和标签的变更都拉到本地

git fetch remote

把远端分支的变更拉到本地,且 merge 到本地分支(fetch + merge)

git fetch origin 分支名 + git merge origin/分支名

将本地分支 push 到远端

git push origin 分支名

--------------------例如--------------------
git push origin master // 将本地master分支推送到远程origin主机的master分支

删除远端分支

git push remote --delete 远端分支名

拉取所有远端的最新代码

$ git fetch --all

git pull

将远程origin主机的master分支合并到当前master分支,冒号后面的部分表示当前本地所在的分支

git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回`origin`主机的`dev`分支,与本地的`dev`分支合并,需要写成下面这样。

git pull origin dev:master

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin dev

允许合并两个不同项目的历史记录

git pull origin master --allow-unrelated-histories

删除远程分支

git push origin -d 分支名

在本地(当前)分支上合并远程分支

git merge origin/master

在本地master分支上合并远程分支

git merge --no-ff origin/develop

终止本次merge,并回到merge前的状态

git merge --abort

参考:

猴子都能懂的Git入门

Git远程操作详解

如何优雅地使用 Git

我在工作中是如何使用 git 的

Git学习专栏

Git 常用操作总结

您必须知道的 Git 分支开发规范

Git merge和rebase分支合并命令的区别

Git自学成才——git merge

GIT merge 和 rebase

git分支管理(3)-fast forward和no fast forward