Git
一、什么是 Git
1. 概念
Git(读音为/g ɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是 Linus Torvalds
为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。
版本控制工具是践行 devops
理念,CI/CD
中的一个环节,是自动化测试工程师不可或缺的一门技术。
2. github,gitee,gitlab 的区别
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。
Gitee 是开源中国(OSChina)推出的基于 Git 的代码托管服务,是国内的 GitHub。
GitLab 是一个用于代码仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。
二、Git 的使用
1. 本地操作
1.1 安装
在 Linux 上安装
如果你想在 Linux 上用二进制安装程序来安装基本的 Git 工具,可以使用发行版包含的基础软件包管理工具来安装。 以 Fedora 为例,如果你在使用它,你可以使用 dnf
:
$ sudo dnf install git-all
如果你在基于 Debian 的发行版上,如 Ubuntu,请使用 apt
:
$ sudo apt install git-all
要了解更多选择,Git 官方网站上有在各种 Unix 发行版的系统上的安装步骤,网址为 https://git-scm.com/download/linux。
在 macOS 上安装
在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 Git 命令即可。
$ git --version
如果没有安装过命令行开发者工具,将会提示你安装。
在 Windows 上安装
在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win,下载会自动开始。双击下载的安装文件,按照引导程序安装即可。
1.2 初次配置
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改,在终端运行如下命令:
git config --global user.name "xinlan"
git config --global user.email "xinlan@example.com"
加了 --global
表示全局设置,且只需要设置一次。
1.3 初始化仓库
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库
如果你有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,那么首先需要进入该项目目录中。之后执行命令:
$ git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。请不要修改它。
1.4 添加文件进行跟踪
git add
命令可将该文件添加到暂存区。
上面的操作,我们仅仅是做了一个初始化的操作,项目里的文件还没有被跟踪。
如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,现在应该开始追踪这些文件了。 可以通过 git add
命令来指定所需的文件来进行追踪。
$ git add *.py
$ git add LICENSE
1.5 提交文件到仓库
git commit
命令将暂存区内容添加到本地仓库中。
要将上一个步骤中追踪的文件提交到仓库,运行命令 git commit
。这样会启动文本编辑器来输入提交说明。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: LICENSE
# new file: test.py
#
~
~
~
~
~
~
~
~
~
~
<sers/men85/Desktop/study/.git/COMMIT_EDITMSG [unix] (21:15 13/09/2021)1,0-1 All
"C:/Users/men85/Desktop/study/.git/COMMIT_EDITMSG" [unix] 12L, 251C
也可以在 commit
命令后添加 -m
选项,将提交信息与命令放在同一行
git commit -m "init"
1.6 Git 的三种状态
Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
工作区即是项目的根目录,是你工作的区域,是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
基本的 Git 工作流程如下:
在工作区中修改文件。
将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
git add
提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
git commit
1.7 检查当前文件状态
你工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。
可以用 git status
命令查看哪些文件处于什么状态。如果所有文件没有修改,且都已经提交到本地数据库,也及时工作区,暂存区,Git 仓库一致,你会看到类似这样的输出:
$ git status
On branch master
nothing to commit, working tree clean
现在,让我们在项目下创建一个新的 README
文件。 如果之前并不存在这个文件,使用 git status
命令,你将看到一个新的未跟踪文件:
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 test.py
的已被跟踪的文件,然后运行 git status
命令,会看到下面内容:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.py
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
no changes added to commit (use "git add" and/or "git commit -a")
我们在练习一下 Git 的工作流程,将增加的文件和修改的内容提交到 Git 仓库。
$ git add .
$ git commit -m "练习"
[master 2852e80] 缁冧範
2 files changed, 1 insertion(+)
create mode 100644 README
当想要跟踪目录下所有的文件时可以运行命令 git add .
1.8 查看提交记录
在提交了若干更新,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log
命令。例如在我的带班课件项目中运行 git log
命令时,可以看到下面的输出:
$ git log
commit 304b472cab3fcff5c220bf3e8e91a2e2fa642003 (HEAD -> master, origin/master)
Author: xinlan <117220100@qq.com>
Date: Thu Aug 26 14:05:00 2021 +0800
日常
commit 65f23a537366f35bd99047438c40547278294028
Author: xinlan <117220100@qq.com>
Date: Fri Aug 6 21:18:35 2021 +0800
haha
commit eca023381f42ce0428ab45c0a8b33621dd2cc6f8
Author: xinlan <117220100@qq.com>
Date: Sat May 29 19:19:24 2021 +0800
py38 day43
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。git log
命令还有很多参数,用来搜索和显示。
其中一个非常有用的参数是 --pretty
。 这个参数可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline
会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short
,full
和 fuller
选项,它们展示信息的格式基本一致,但是详尽程度不一:
$ git log --pretty=oneline
304b472cab3fcff5c220bf3e8e91a2e2fa642003 (HEAD -> master, origin/master) 日常
65f23a537366f35bd99047438c40547278294028 haha
eca023381f42ce0428ab45c0a8b33621dd2cc6f8 py38 day43
1b174b1486bae0554ff8a79acca55369387480f9 py41 day2
5ae08fa293a9a6bd7eddf8cb365e07cc221f0c07 py38day42
6fe8725de1151455f25e069ad80357edf5c4d6b0 'py38day41'
2effcc5dc6670a23cdbf4049321923b735ae3f16 add 41
1.9 回退版本
git reset 命令用于回退版本,可以指定退回某一次提交的版本。
git reset 命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
–mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset [HEAD]
举例
$ git reset HEAD file #如果想撤销提交到暂存区的文件
$ git reset –soft HEAD^n #如果想撤销提交到本地仓库的文件
$ git reset –mixed HEAD^n #恢复当前分支的版本库和索引区至上一次提交的状态,工作区不变更
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
$ git reset --hard HEAD~3 # 回退上上上一个版本
$ git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样 ****
现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下:
$ git status -s
M README
M hello.php
$ git add .
$ git status -s
M README
M hello.php
$ git reset HEAD hello.php
Unstaged changes after reset:
M hello.php
$ git status -s
M README
M hello.php
现在你执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的。
$ git commit -m '修改'
[master f50cfda] 修改
1 file changed, 1 insertion(+)
$ git status -s
M hello.php
可以看到 hello.php 文件的修改并未提交。
这时我们可以使用以下命令将 hello.php 的修改提交:
$ git commit -am '修改 hello.php 文件'
[master 760f74d] 修改 hello.php 文件
1 file changed, 1 insertion(+)
$ git status
On branch master
nothing to commit, working directory clean
简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存。
1.10 git rm 命令
实例
将文件从暂存区和工作区中删除:
$ git rm hello.php
rm 'hello.php'
$ ls
README****
文件从暂存区域移除,但工作区保留:
$ git rm --cached README
rm 'README'
$ ls
README
可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm –r *
1.11 git stash 命令
当我们开发一个新功能时会先从master拉出一个分支dev,在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug ,需要马上解决,但是新功能做到了一半你又不想提交。
这时就可以使用 git stash 命令先把当前进度保存起来,然后切换到另一个分支去修改bug;修改完提交后,再切回 dev 分支,使用git stash pop来恢复之前的进度继续开发新功能。
使用场景
有人与我改动同一分支
我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法 push 或者 pull。此时,就可以用 git stash 来处理
// 把本地的改动暂存起来
git stash
// 拉取远程分支(此时本地分支会回滚到上次commit的情况,你的改动都存在stash中)
git pull
// 将stash中改动重新加回本地分支,就可以继续修改了,当然,如果改好了就是add,commit,push
git stash pop
不小心改动了其他分支
例如忘记切换,将代码写错了分支,直接在 master 分支上做改动
// 把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态
git stash
// 切换到需要改动的分支
git checkout test
// 将改动pop到自己当前的分支
git stash pop
2. 远程操作
2.1 创建远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。
要创建自己的远程仓库,最简单的方法是在 gitee(码云),或 GitHub 上创建一个远程仓库。这里推荐使用码云,中文且速度快,下面以码云为例。码云地址 https://gitee.com/,注册账号请自理。
注册并登录码云后,点击右上角的加号,选择新建仓库
进入新建仓库页面,填写必要选项后,点击创建
仓库创建成功后会出现下面的页面,包含仓库的地址和一些帮助信息
2.2 添加远程仓库
运行 git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写。运行
$ git remote add origin git@gitee.com:wcflove/study.git
这会给当前本地仓库添加一个远程仓库,地址为 git@gitee.com:wcflove/study.git
,远程仓库地址的简写为 origin
(你可以取你想要的名字)。
运行 git remote -v
命令可以查看远程仓库信息,一个本地仓库可以有多个远程仓库。
$ git remote -v
gitee git@gitee.com:wcflove/study.git (fetch)
gitee git@gitee.com:wcflove/study.git (push)
gitee 为远程地址的别名。
2.3 推送到远程仓库
通过命令 git push <remote> <branch>
可以将你的本地项目推送到远程仓库。当你想要将 master
分支(关于分支我们后面再详细讨论)推送到 origin
服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字), 那么运行这个命令就可以将你所做的备份到服务器:
$ git push origin master
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 481 bytes | 481.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.1]
To gitee.com:wcflove/study.git
* [new branch] master -> master
注意:这一步操作需要验证你的权限,如果在添加远程仓库时,使用的是 https
协议的地址,那么需要你输入用户名和密码。如果使用的是 ssh
协议地址,那么需要配置 ssh
的公钥(详见码云帮助文档)。
推送成功后刷新你的远程仓库,你会看到刚刚推送上去的文件。
2.4 从远程仓库中拉取
这个命令会访问远程仓库,从中拉取所有你还没有的数据,并自动合并该远程分支到当前分支。
git pull <远程主机名> <远程分支名>:<本地分支名>
将远程主机origin的master分支拉取过来,与本地的branchtest分支合并,可以执行:
git pull origin master:branchtest
如果将冒号和后面的branchtest去掉,则表示将远程origin仓库的master分支拉取下来与本地当前分支合并
2.5 克隆远程仓库
运行命令 git clone <url>
会将远程仓库下载到当前目录。例如:
git clone git@gitee.com:wcflove/study.git
这会在当前目录创建 study
文件夹,并在这个目录下初始化一个 .git
文件夹,自动将地址 git@gitee.com:wcflove/study.git
添加为远程仓库并默认以 “origin” 为简写, 自动设置本地 master 分支跟踪克隆的远程仓库的 master
分支,并从远程仓库拉取 master 分支下所有数据放入 .git
文件夹,然后从中读取最新版本的文件的拷贝。clone操作是一个从无到有的克隆操作,再次强调不需要git init初始化。
2.6 git fetch 更新远程代码到本地仓库
将远程主机origin的master分支拉取过来,与本地的branchtest分支合并
$ git fetch origin master:brantest
$ git merge brantest
相比起来,git fetch更安全也更符合实际要求,因为可以在merge前,我们可以查看更新情况,根据实际情况再决定是否合并。
注:git fetch不会进行合并,执行后需要手动执行git merge合并,而git
pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull是使用给定的参数运行git fetch,并调用git
merge将检索到的分支头合并到当前分支中。
2.7补充
git remote rm name # 删除远程仓库
git remote rename old_name new_name # 修改仓库名
3. 分支操作
3.1 分支简介
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。在进行提交操作时,Git 会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针,还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象。
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master
。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master
分支。 master
分支会在每次提交时自动向前移动。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换
3.2 创建分支
创建分支非常简单,它只是为你创建了一个可以移动的新的指针。 比如,创建一个 testing 分支, 你需要使用 git branch
命令:
语法:git branch (branchname)
$ git branch testing
这会在当前所在的提交对象上创建一个指针。
Git 中有一个名为 HEAD
的特殊指针,指向当前所在的本地分支(译注:将 HEAD
想象为当前分支的别名)。 在本例中,你仍然在 master
分支上。 因为 git branch
命令仅仅 创建 一个新分支,并不会自动切换到新分支中去。
3.3 切换分支
要切换到一个已存在的分支,你需要使用 git checkout
命令。 我们现在切换到新创建的 testing
分支去:
$ git checkout testing
我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。
这样HEAD
就指向testing
分支了。
3.4 合并分支
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
当我们在 testing 分支上工作并形成了一些列提交后,可以切换回 master 分支,然后运行 git merge
命令:
$ git checkout master
$ git merge testing
将其合并到 master 分支上。
3.5 解决冲突
有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
$ git merge testing
Auto-merging test.py
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status
命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: test.py
no changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:
<<<<<<< HEAD:test.py
print('hello world!')
=======
print("hello world!")
>>>>>>> dev:test.py
这表示 HEAD
所指示的版本(也就是你的 master
分支所在的位置,因为你在运行 merge 命令的时候已经切换到了这个分支)在这个区段的上半部分(=======
的上半部分),而 dev
分支所指示的版本在 =======
的下半部分。 为了解决冲突,你必须选择使用由 =======
分割的两部分中的一个,或者你也可以自行合并这些内容。
例如,你可以通过把这段内容换成下面的样子来解决冲突:
print("hello world!")
上述的冲突解决方案仅保留了其中一个分支的修改,并且 <<<<<<<
, =======
, 和 >>>>>>>
这些行被完全删除了。 在你解决了所有文件里的冲突之后,对每个文件使用 git add
命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
你可以再次运行 git status
来确认所有的合并冲突都已被解决:
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: test.py
如果你对结果感到满意,并且确定之前有冲突的的文件都已经暂存了,这时你可以输入 git commit
来完成合并提交。
解决Git的冲突问题的方法
方法一:
通过git pull拉取远程仓库文件到本地仓库,如果发生冲突会提示,根据提示解决冲突
例如:
这是远程仓库abc.txt文件的内容:
这是本地仓库abc.txt文件的内容(注意:该文件需要执行git add与git commit命令提交到本地仓库):
现在要将远程仓库的文件拉取到本地通过git pull命令,如下会报冲突错误:
打开本地仓库的abc.txt文件
需要手动解决冲突。
解决冲突后,提交到本地仓库后,再推送到远程仓库
在远程仓库查看
方法二:
解决冲突的方法:
通过git stash命令,把工作区的修改提交到栈区,目的是保存工作区的修改;
通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突;
通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中;
冲突一般发生在将远程仓库中的文件拉取到本地仓库中,有同名文件,而内容不同的情况下。
这是远程仓库abc.txt文件的内容:
这是本地仓库abc.txt文件的内容(注意:该文件是保存在工作区的,即不执行git add命令,不保存到暂存区甚至本地仓库中):
(可以看到当前修改并没有保存到暂存区)
通过git stash命令,把工作区的修改提交到栈区,目的是保存工作区的修改
(执行完上面命令后,abc.txt文件内容变成了未修改前,即上一次commit提交的内容)
通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突
通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中
然后手动解决冲突,再通过git push推送到远程仓库
推荐 Git 工作中的常用命令
Git常用命令参考手册
git init # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config --global color.ui true # git status等命令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库
git status # 查看当前版本状态(是否修改)
git add xyz # 添加xyz文件至index
git add . # 增加当前子目录下所有更改过的文件至index
git commit -m 'xxx' # 提交
git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改)
git commit -am 'xxx' # 将add和commit合为一步
git rm xxx # 删除index中的文件
git rm -r * # 递归删除
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log -5
git log --stat # 显示提交日志及相关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag # 显示已存在的tag
git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
git show v2.0 # 显示v2.0的日志及详细内容
git log v2.0 # 显示v2.0的日志
git diff # 显示所有未添加至index的变更
git diff --cached # 显示所有已添加index但还未commit的变更
git diff HEAD^ # 比较与上一个版本的差异
git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异
git diff origin/master..master # 比较远程分支master上有本地分支master上没有的
git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)
git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支
git branch -m master master_copy # 本地分支改名
git checkout -b master_copy # 从当前分支创建新分支master_copy并检出
git checkout -b master master_copy # 上面的完整版
git checkout features/performance # 检出已存在的features/performance分支
git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0 # 检出版本v2.0
git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出
git checkout -- README # 检出head版本的README文件(可用于修改错误回退)
git merge origin/master # 合并远程master分支至当前分支
git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改
git push origin master # 将当前分支push到远程master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags # 把所有tag推送到远程仓库
git fetch # 获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master # 获取远程分支master并merge到当前分支
git mv README README2 # 重命名文件README为README2
git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933
git ls-files # 列出git index包含的文件
git show-branch # 图示当前分支历史
git show-branch --all # 图示所有分支历史
git whatchanged # 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD # 内部命令:显示某个git对象
git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH
git reflog # 显示所有提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday} # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash # 暂存当前修改,将所有至为HEAD状态
git stash list # 查看所有暂存
git stash pop #恢复最近一次的暂存。
git stash show -p stash@{0} # 参考第一次暂存
git stash apply stash@{0} # 应用第一次暂存
git grep "delete from" # 文件中搜索文本“delete from”
评论