Git

  1. Git教程:[https://www.yiibai.com/git](https://www.yiibai.com/git) | [https://www.runoob.com/git/git-tutorial.html](https://www.runoob.com/git/git-tutorial.html) | [https://www.w3cschool.cn/git/](https://www.w3cschool.cn/git/)
  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

git常用命令教程 - 图1

git常用命令教程 - 图2

Git 常用以下 6 个命令:

  1. $ git clone # 拷贝一份远程仓库,也就是下载一个项目
  2. $ git push # 上传远程代码并合并
  3. $ git add # 添加文件到暂存区
  4. $ git commit # 提交暂存区到本地仓库
  5. $ git checkout # 创建分支
  6. $ git pull # 下载远程代码并合并

一个简单的操作步骤:

  1. $ git init # 初始化仓库
  2. $ git add . # 添加文件到暂存区
  3. $ git commit -m '备注说明' # 提交暂存区到本地仓库

用户信息

  1. $ git config --global user.name "huangpw" # 用户名称 - 全局配置
  2. $ git config --global user.email 1042850644@qq.com # 电子邮件 - 全局配置

差异分析工具

  1. $ git config --global merge.tool vimdiff

查看配置信息

  1. $ git config --list

创建仓库命令

命令 说明
git init 初始化仓库
git clone 拷贝一份远程仓库,也就是下载一个项目

git init 命令

git init 命令用于在目录中创建新的 Git 仓库。

目录 中执行 git init 就可以创建一个 Git 仓库了。

实例

  1. $ mkdir test # 创建目录
  2. $ cd test/ # 进入目录
  3. $ git init # 初始化仓库
  4. Initialized empty Git repository in /Users/test/www/test/.git/
  5. # 初始化空 Git 仓库完毕。

git clone 命令

git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。

  1. $ git clone [url] # 命令格式 -[url] 是你要拷贝的项目
  2. # 如下:
  3. $ git clone https://github.com/test/test-git-test # https地址
  4. $ git clone git@gitee.com:huangpw_Abc/vant-vue.git # ssh地址

执行结果输出…

  1. Cloning into 'test-git-test'...
  2. remote: Enumerating objects: 12, done.
  3. remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 12
  4. Unpacking objects: 100% (12/12), done.

提交与修改

命令 说明
git add 添加文件到暂存区
git status 查看仓库当前的状态,显示有变更的文件
git diff 比较文件的不同,即暂存区和工作区的差异
git commit 提交暂存区到本地仓库
git reset 回退版本
git rm 删除工作区文件
git mv 移动或重命名工作区文件

git add 命令

git add 命令可将该文件添加到暂存区。

  1. $ git add [file1] [file2] ... # 添加一个或多个文件到暂存区
  2. $ git add [dir] # 添加指定目录到暂存区,包括子目录
  3. $ git add . # 添加当前目录下的所有文件到暂存区

实例

  1. $ touch README.md # 创建文件 README.md
  2. $ touch hello.php # 创建文件 hello.php
  3. $ git status -s # 查看项目的当前状态
  4. $ git add README hello.php # 添加文件到暂存区
  5. $ git README # 编辑README文件
  6. $ git status -s # 再次查看项目的当前状态
  7. AM README
  8. A hello.php

AM 状态,表示文件有改动。A 状态 表示文件无该改动。

  1. $ git add . # 添加所有AM文件到暂存区
  2. $ git status -s
  3. A README
  4. A hello.php

文件修改后,我们一般都需要进行 git add 操作,从而保存历史版本。

git status 命令

git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。

  1. $ git status # 输出全部文件内容
  2. $ git status -s # 输出简短内容

git diff 命令

git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。

git diff 命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别。

git diff 有两个主要的应用场景。

  • 尚未缓存的改动:git diff
  • 查看已缓存的改动: git diff —cached
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff —stat
  1. $ git diff [file] # 显示暂存区和工作区的差异 git diff
  2. $ git diff --cached [file] # 显示暂存区和上一次提交(commit)的差异
  3. # 或
  4. $ git diff --staged [file] # 显示暂存区和上一次提交(commit)的差异
  5. $ git diff commit-id1(前一个提交) commit-id2(后一个提交) # 查看两个commit的差异
  6. $ git diff commit-id1 commit-id2 --stat # 查看两个commit的差异文件
  7. $ git diff --stat # 仅仅比较统计信息
  8. $ git diff HEAD # 显示工作版本(Working tree)和HEAD的差别
  9. $ git diff <branch1> <branch2> # 在两个分支之间比较

git commit 命令

前面使用 git add 命令将内容写入暂存区。

git commit 命令将暂存区内容添加到本地仓库中。

  1. $ git commit -m [message] # 提交暂存区到本地仓库中 [message] 可以是一些备注信息
  2. $ git commit [file1] [file2] ... -m [message] # 提交暂存区的指定文件到仓库区 [file1] 文件名 [message] 可以是一些备注信息
  3. $ git commit -a # -a 参数设置:修改文件后,不需要执行 git add 命令,提交暂存区,直接commit提交本地仓库

设置提交代码时的用户信息

  1. $ git config --global user.name "huangpw" # 用户名称
  2. $ git config --global user.email 1042850644@qq.com # 电子邮件

提交修改

  1. $ git add hello.php # 提交暂存区
  2. $ git status -s # 查看文件状态,输出以下结果:
  3. A README
  4. A hello.php
  5. $ git commit -m 'first commit' # 提交本地仓库,输出以下结果:
  6. [master (root-commit) d32cf1f] first commit
  7. 2 files changed, 4 insertions(+)
  8. create mode 100644 README
  9. create mode 100644 hello.php

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。

命令格式如下:

  1. $ git commit -a # 命令格式
  2. $ git commit -am '修改 hello.php 文件' # 使用格式

git reset 命令

git reset 命令用于回退版本,可以指定退回某一次提交的版本。

  1. $ git reset [--soft | --mixed | --hard] [HEAD]

—mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

  1. $ git reset [HEAD] # 目录格式

实例

  1. $ git reset HEAD^ # 回退所有内容到上一个版本
  2. $ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
  3. $ git reset 052e # 回退到指定版本

—soft 参数用于回退到某个版本:

  1. $ git reset --soft HEAD

实例

  1. $ git reset --soft HEAD~3 # 回退上上上一个版本

—hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:

  1. $ git reset --hard HEAD # 命令格式

实例

  1. $ git reset hard HEAD~3 # 回退上上上一个版本
  2. $ git reset hard bae128 # 回退到某个版本回退点之前的所有信息
  3. $ git reset --hard origin/master # 将本地的状态回退到和远程的一样

注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。

HEAD 说明:

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • 以此类推…

可以使用 ~数字表示

  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本
  • HEAD^3 上上上一个版本
  • 以此类推…
  1. $ git status -s # 查看状态
  2. M README
  3. M hello.php
  4. $ git add . # 提交暂存区
  5. $ git status -s # 查看状态
  6. M README
  7. M hello.php
  8. $ git reset HEAD hello.php # 取消缓存
  9. Unstaged changes after reset:
  10. M hello.php
  11. $ git status -s # 查看状态
  12. M README
  13. M hello.php

git rm 命令

git rm 命令用于删除文件。

  1. $ git rm <file> # 将文件从暂存区和工作区中删除
  2. $ git rm text1.txt # 使用格式
  3. $ git rm -f test.txt # 强行从暂存区和工作区中删除修改后的 test.txt 文件,强制删除选项 -f

可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:

  1. $ git rm r * # 命令格式 进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录
  2. $ git rm -r mydir # 删除文件夹:mydir,并把它从git的仓库管理系统中移除
  1. $ git rm --cached <file> # 文件从暂存区域移除 使用 --cached 选项
  2. $ git rm --cached test.txt # 使用格式

实例

  1. $ git rm hello.php # 删除 hello.php 文件,工作区不保留
  2. rm 'hello.php'
  3. $ ls
  4. README
  1. $ git rm --cached hello.php # 删除 hello.php 文件,工作区保留
  2. rm 'hello.php'
  3. $ ls
  4. README

git mv 命令

git mv 命令用于移动或重命名一个文件、目录或软连接。

  1. $ git mv [file] [newfile] # 命令格式 文件重命名
  2. $ git mv -f [file] [newfile] # 如果新文件名已经存在,但还是要重命名它,可以使用 -f 参数

实例

  1. $ git add README # 添加一个 README 文件
  2. $ git mv README README.md # 文件重命名
  3. $ ls
  4. README.md

提交日志

命令 说明
git log 查看历史提交记录
git blame <file> 以列表形式查看指定文件的历史修改记录

git log 命令

  1. $ git log #查看历史提交记录
  2. $ git log --oneline # 用 --oneline 选项来查看历史记录的简洁的版本 倒序
  3. $ git log --reverse --oneline # 用 --reverse 参数来逆向显示所有日志 顺序
  4. $ git log --no-merges # 显示整个提交历史记录,但跳过合并(不显示合并)
  5. $ git log master include/scsi drivers/scsi # 所有提交更改 include/scsi 或 drivers/scsi 子目录中的任何文件的所有提交
  6. $ git log --author=Linus --oneline -5 # 查看Git 源码中 Linus 提交的部分

如果你要指定日期,可以执行几个选项:—since 和 —before,但是你也可以用 —until 和 —after。

例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 —no-merges 选项以隐藏合并提交):

  1. $ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges # 命令格式

git blame 命令

查看指定文件的修改记录,可以使用 git blame 命令,格式如下:

  1. $ git blame <file> # 命令格式
  2. $ git blame README # 使用格式

远程操作

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并

git remote 命令

git remote 命令用于在远程仓库的操作。

  1. $ git remote -v # 显示所有远程仓库

以下我们先载入远程仓库,然后查看信息:

  1. $ git clone https://github.com/test/test-git-test # 克隆(拷贝)项目
  2. $ cd test-git-test # 进入项目
  3. $ git remote -v # 显示所有远程仓库
  4. origin https://github.com/test/test-git-test (fetch)
  5. origin https://github.com/test/test-git-test (push)

origin 为远程地址的别名。

显示某个远程仓库的信息:

  1. $ git remote show [remote] # 显示某个远程仓库的信息
  2. $ git remote show https://github.com/test/runoob-git-test # 使用格式

添加远程版本库:

  1. $ git remote add [shortname] [url] # 添加远程版本库

shortname 为本地的版本库,例如:

  1. # 提交到 Github
  2. $ git remote add origin git@github.com:test/runoob-git-test.git # 添加远程版本库
  3. $ git push -u origin master # 提交远程仓库

其他相关命令:

  1. $ git remote rm name # 删除远程仓库
  2. $ git remote rename old_name new_name # 修改仓库名

git fetch 命令

git fetch 命令用于从远程获取代码库。

  1. $ git merge # 从远端仓库提取数据,并尝试合并到当前分支

该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支。

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:

  1. $ git fetch [alias] # git fetch origin 在本地更新修改

以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:

  1. $ git merge [alias]/[branch] # git merge origin/master master 分支,将更新同步到本地

git pull 命令

git pull 命令用于从远程获取代码并合并本地的版本。

git pull 其实就是 git fetchgit merge FETCH_HEAD 的简写。 命令格式如下:

  1. $ git pull <远程主机名> <远程分支名>:<本地分支名> # git pull origin master:brantest
  2. # origin 远程主机名
  3. # master 远程分支名
  4. # brantest 本地分支名

实例

  1. $ git pull # 更新操作
  2. $ git pull origin # 更新操作

将远程主机 originmaster 分支拉取过来,与本地的 brantest 分支合并。

  1. $ git pull origin master:brantest

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

  1. $ git pull origin master

上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。

实例

  1. $ git remote -v # 查看信息
  2. origin https://github.com/test/runoob-git-test (fetch)
  3. origin https://github.com/test/runoob-git-test (push)
  4. $ git pull origin master # 更新操作
  5. From https://github.com/test/runoob-git-test
  6. * branch master -> FETCH_HEAD
  7. Already up to date.

上面命令表示,取回 origin/master 分支,再与本地的 master 分支合并。

git push 命令

git push 命用于从将本地的分支版本上传到远程并合并。

  1. $ git push <远程主机名> <本地分支名>:<远程分支名> # 命令格式

如果本地分支名与远程分支名相同,则可以省略冒号:

  1. $ git push <远程主机名> <本地分支名> # 命令格式
  1. $ git push origin master
  2. # 相等于
  3. $ git push origin master:master

如果本地版本与远程版本有差异,但又要强制推送可以使用 —force 参数:

  1. git push --force origin master

删除主机的分支可以使用 —delete 参数,以下命令表示删除 origin 主机的 master 分支:

  1. git push origin --delete master

以我的 https://github.com/test/test-git-test 为例,本地添加文件:

  1. $ touch test.txt # 添加文件
  2. $ git add rtest.txt # 提交暂存区
  3. $ git commit -m "添加到远程" # 提交本地仓库
  4. master 69e702d] 添加到远程
  5. 1 file changed, 0 insertions(+), 0 deletions(-)
  6. create mode 100644 test.txt
  7. $ git push origin master # 推送到 Github

分支管理

git branch命令

git branch命令用于列出,创建或删除分支。

1.查看当前有哪些分支

  1. $ git branch
  2. master
  3. * wchar_support

2. 新建一个分支 dev2

  1. $ git branch dev2

3.切换到指定分支

  1. $ git checkout dev2 # 切换分支
  2. $ git branch # 再次查看分支
  3. * dev2
  4. master
  5. wchar_support

4.查看本地和远程分支

  1. $ git branch -a
  2. * dev2
  3. master
  4. wchar_support
  5. remotes/origin/HEAD -> origin/master
  6. remotes/origin/master
  7. remotes/origin/wchar_support

5.将更改添加到新建分支上

  1. # 将更改添加到新建分支上
  2. $ git status # 查看状态
  3. $ git add newfile.txt # 提交暂存区
  4. $ git commit newfile.txt -m "commit a new file: newfile.txt" # 提交本地仓库
  5. $ git push origin dev2 # 提交远程仓库dev2

6.修改分支的名字

  1. $ git branch # 查看分支
  2. $ git branch -m dev2 version.2 # 修改分支名称
  3. $ git branch -r # 列出远程分支
  4. $ git branch # 再次查看分支

7.删除远程分支

  1. $ git branch # 查看分支
  2. $ git push origin --delete dev2 #删除远程分支

8.合并某个分支到当前分支

  1. # 合并分支:version.2到当前分支(master)
  2. $ git branch # 查看分支
  3. $ git checkout master # 切换分支
  4. $ git status # 查看状态
  5. $ git merge version.2 # 合并分支

git checkout命令

git checkout命令用于切换分支或恢复工作树文件。

git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区。

实例

以下顺序检查主分支,将Makefile还原为两个修订版本,错误地删除hello.c,并从索引中取回。

  1. $ git checkout master # 切换分支
  2. $ git checkout master~2 Makefile # 从另一个提交中取出文件
  3. $ rm -f hello.c
  4. $ git checkout hello.c # 从索引中恢复hello.c

实例

在错误的分支工作后,想切换到正确的分支,则使用:

  1. $ git checkout mytopic

但是,您的“错误”分支和正确的“mytopic”分支可能会在在本地修改的文件中有所不同,在这种情况下,上述检出将会失败:

  1. $ git checkout mytopic
  2. error: You have local changes to 'frotz'; not switching branches.

可以将-m标志赋给命令,这将尝试三路合并:

  1. $ git checkout -m mytopic
  2. Auto-merging frotz

在这种三路合并之后,本地的修改没有在索引文件中注册,所以git diff会显示从新分支的提示之后所做的更改。

实例

当使用 -m 选项切换分支时发生合并冲突时,会看到如下所示:

  1. $ git checkout -m mytopic
  2. Auto-merging frotz
  3. ERROR: Merge conflict in frotz
  4. fatal: merge program failed

此时,git diff会显示上一个示例中干净合并的更改以及冲突文件中的更改。 编辑并解决冲突,并用常规方式用git add来标记它:

  1. $ edit frotz # 编辑 frotz 文件中内容,然后重新添加
  2. $ git add frotz

其它实例

git checkout的主要功能就是迁出一个分支的特定版本。默认是迁出分支的HEAD版本
一此用法示例:

  1. $ git checkout master #//取出master版本的head。
  2. $ git checkout tag_name #//在当前分支上 取出 tag_name 的版本
  3. $ git checkout master file_name #//放弃当前对文件file_name的修改
  4. $ git checkout commit_id file_name #//取文件file_name的 在commit_id是的版本。commit_id为 git commit 时的sha值。
  5. $ git checkout -b dev/1.5.4 origin/dev/1.5.4
  6. # 从远程dev/1.5.4分支取得到本地分支/dev/1.5.4
  7. $ git checkout -- hello.rb
  8. #这条命令把hello.rb从HEAD中签出.
  9. $ git checkout .
  10. #这条命令把 当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子.
  11. #注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。

git merge命令

git merge 命令用于将两个或两个以上的开发历史加入(合并)一起。

实例

合并分支fixesenhancements在当前分支的顶部,使它们合并:

  1. $ git merge fixes enhancements

实例

合并obsolete分支到当前分支,使用ours合并策略:

  1. $ git merge -s ours obsolete

实例

将分支maint合并到当前分支中,但不要自动进行新的提交:

  1. $ git merge --no-commit maint

实例

将分支dev合并到当前分支中,自动进行新的提交:

  1. $ git merge dev

git mergetool命令

git mergetool命令用于运行合并冲突解决工具来解决合并冲突。

  1. git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…] # 命令格式

使用方法如下:

  1. diff使用方法:

    • git difftool HEAD // 比较当前修改情况
  2. merge使用方法

    • git mergetool

其他指令

git help 命令

git help命令显示有关Git的帮助信息。

  1. $ git help help # 查看帮助

git stash命令

git stash命令用于将更改储藏在脏工作目录中。

git tag命令

git tag命令用于创建,列出,删除或验证使用GPG签名的标签对象。

git submodule命令

git submodule命令用于初始化,更新或检查子模块。

git show命令

git show命令用于显示各种类型的对象。

git shortlog命令

git shortlog命令用于汇总git日志输出。

git describe命令

git describe命令显示离当前提交最近的标签。

git rebase命令

git rebase命令在另一个分支基础之上重新应用,用于把一个分支的修改合并到当前分支。

清屏

  1. clear