Contents
  1. 1. 安装Git
  2. 2. 基本术语解释
    1. 2.1. Git仓库 - 代码存储的地方
      1. 2.1.1. 本地仓库
      2. 2.1.2. 远程仓库(origin)
    2. 2.2. 分支(Branch)
    3. 2.3. HEAD
    4. 2.4. 提交修改(Commit)
    5. 2.5. 推送(Push)
    6. 2.6. 拉取(Pull)
    7. 2.7. Checkout
  3. 3. 复制(Clone)远程代码到本地
  4. 4. 撤销本地的文件修改
  5. 5. 在某个分支的基础上创建一个新的分支(本地仓库)
  6. 6. 用指定的远程分支更新当前的分支
  7. 7. 关联当前的分支和远程的分支
  8. 8. 修改当前项目提交(commit)的作者名称
  9. 9. 修改上一次提交(commit)的作者
  10. 10. 修改指定提交(commit)的信息(作者或者注释信息)
  11. 11. 查看提交(commit)的记录:
  12. 12. 撤销上一次提交(Commit)
  13. 13. 撤销上一次已经推送(push)上远程仓库的提交
  14. 14. Merge操作
    1. 14.1. 合并(Merge)
    2. 14.2. Cherry
  15. 15. 冲突
  16. 16. 强制覆盖本地文件
  17. 17. 删除没有加入版本控制(untrak)的文件
  18. 18. 分享本地仓库
  19. 19. 创建标签(Tag)
  20. 20. 推送带特殊字符的分支
  21. 21. 解决EOF错误
  22. 22. 修改提交(commit)的作者信息
  23. 23. 修改远程仓库的地址
  24. 24. HTTP仓库地址中加入用户名和密码
  25. 25. 分支覆盖,需要用到强行提交 -f
  26. 26. Git 查看配置
  27. 27. Git 帐号名密码保持

Git 是一个免费,开源,分布式源代码管理(版本控制) 系统。本文介绍一些git命令的使用方法,关于git的原理解释就不在此处提及。

安装Git

打开https://git-scm.com/网站,选择系统对应版本的Git安装包下载后安装即可。

基本术语解释

Git仓库 - 代码存储的地方

本地仓库

顾名思义是在你自己本地机器上保存(commit)的代码版本控制信息。

远程仓库(origin)

一个网络上的共享仓库(比如说你在Github上创建一的项目,这个项目地址就是一个共享仓库),本地仓库的代码信息推送(push)到远程仓库上之后,别的开发者就可以拉取(pull)到他们了。

分支(Branch)

Git是通过链表的模式存储代码的每一次提交信息的,分支就是指向这个链表某一个节点的指针。我们可以创建多个分支,然后在这个分支上的提交就会分出一个新的链表。

和分支一起使用,HEAD始终指向当前分支的最新的提交点。

提交修改(Commit)

提交修改只是在当前分支创建一个新的节点,这个提交包含代码的变动,并且包含提交的信息和相关的注释(比如修改了什么)。提交只是把代码修改信息保存在本地仓库。

推送(Push)

Push是将本地仓库保持的代码修改信息同步到远程仓库上。

拉取(Pull)

拉取(pull)一个分支意味着把它相关的代码提交(Commit)抓取(fetch)下来并合并(merge)到当前的分支中。

Checkout

修改当前的工作分支为另外一个分支。

复制(Clone)远程代码到本地

1
$ git clone <版本库网址>  <本地文件夹> ## 这个命令是默认建立master分支

在clone出master分支之后,在对应的master文件夹下面使用checkout命令可以下载分支的代码

1
$ git checkout -b branch origin/branch  ## 这个命令会在当前目录下载指定分支

如果只需要一个branch的代码,可以考虑直接clone一个branch的代码

1
$ git clone -b <branch name> <版本库网址> <本地文件夹位置(可选)> ## 这个命令可以clone对应的branch代码并且放到指定的文件夹中

撤销本地的文件修改

使用远程版本库的文件覆盖本地的文件,其本质是将本地版本库的文件头回退,即是使得git记录文件修改的文件忘记本次修改的内容,然后是用pull更新当前代码。

1
2
$ git reset --hard
$ git pull

在某个分支的基础上创建一个新的分支(本地仓库)

1
$ git checkout -b <新分支名字> origin/<远程分支名> ## 这个命令只会在本地仓库创建一个新的分支,需要执行提交(commit)和推送( push)命令后才会在远程仓库创建。

用指定的远程分支更新当前的分支

这个命令要在需要更新分支的文件目录下执行

1
$ git pull origin <远程仓库上的分支名>

关联当前的分支和远程的分支

这个命令可以指定当前本地的分支的拉取操作(pull)和推送操作(push)的远程仓库对应的分支是哪一个(如果是直接从远程分支checkout的分支就默认关联同名)

1
$ git bran -- set-upstram <localBranch> origin/<remoteBranch>

修改当前项目提交(commit)的作者名称

1
2
$ git config user.name <name> ## 修改用户名称
$ git config user.email <emailmail@xxx.com> ## 修改提交(commit)的作者的email

以上的两个步骤也可以打开.git文件目录下的config文件,修改里面的author和email。修改完成之后下一次提交(commit)就会适应这个新的配置了。

修改上一次提交(commit)的作者

1
$ git commit --amend --author='Gavin Luo <emailmail@main.com>'

修改指定提交(commit)的信息(作者或者注释信息)

首先用以下命令进入编辑模式

1
git  rebase --interactive  commi_id^

然后在出现的编辑窗口(vim编辑器类似:i进入编辑模式,esc结束编辑进入命令模式,:w保存修改,:q退出)将要要修改的提交(commit)前面的pick改成edit。然后执行命令

1
git  commit  --amend

在出现的界面中填写相关信息后使用以下命令提交修改

1
2
git rebase --continue
git push --rebase

查看提交(commit)的记录:

1
$ git log

撤销上一次提交(Commit)

如果在提交之前忘记拉取(pull)最新的代码下来会导致无法推送(push)本地修改的代码到远程,这个时候可以先撤销上一次的提交,更新本地代码之后再从那时提交一次就可以了。
重置(reset)命令是可以撤销本地的提交,不过要记得重置(reset)之后要拉取(pull)一下,把远程的更新拉到本地。注意这个命令不会产生新的提交(commit)。

1
2
$ git reset HEAD~1
$ git pull

撤销上一次已经推送(push)上远程仓库的提交

1
2
$ git revert HEAD
$ git push

这个命令会产生一个新的提交(commit)。

Merge操作

合并(Merge)

合并是将一个分支的修改内容合并到另外一个分支。首先切换(checkout)到要进行合并(merge)的分支(branch)目录下,然后指定要合并进来的另外一个分支的名字。

1
2
3
$ git checkout localbranch
$ git merge origin/remotebranch
## remotebranch的修改会合并到当前的localbranch中

Cherry

Cherry 命令可以挑选一个分支上的某些提交(commit)合并到当前分支上。

1
2
$ git checkout localbranch
$ git cherry-pick 12345 ##12345为commit id

如果是要同时挑选多个提交(commit)可以使用-n

1
2
3
4
$ git checkout localbranch
$ git cherry-pick -n 12345 ##12345为commit id
$ git cherry-pick -n 13333 ##1333为commit id
$ git commit -m "cherry test"

冲突

执行会导致合并的相关命令(merge、cherry)后如果没有冲突,那么合并对象分支的修改就会合并到当前的分支中了。如果发生了冲突,就需要先打开文件解决冲突,然后把修改好的冲突文件重新添加(add)之后再提交(commit)一次。

强制覆盖本地文件

相信很多人都很烦恼合并(merge)的问题,如果发生了很蛋疼的冲突(难于修复),可以直接用服务器上代码更新本地的代码,但是本地修改就会丢失。

1
2
3
$ git fetch --all
$ git reset --hard
$ git pull

删除没有加入版本控制(untrak)的文件

不小心批量添加了文件,在没有提交之前可以一次性全部删除

1
2
3
$ git clean -f  ## 删除 untracked files
$ git clean -fd ## 删除文件的同时也会删除文件夹
$ git clean -xfd ## gitignore 的也会被删除

在命令前加上-n可以查看会被删除掉的文件

1
$ git clean -nxfd

分享本地仓库

当你从远程仓库拷贝(clone)代码之后,你本地其实也同时建立了一个完整的仓库。你可以将这个仓库作为团队开发时的共享仓库
在windows系统下,你只需要共享你的项目文件夹,然后让其他组员通过git clone file:///$你的共享项目路径就可以了。
如果其他组员也下载了远程仓库的代码,那么可以让他们修改.git文件夹内的config文件,将其中的[remote “origin”]下的ulr地址改成你的共享文件夹目录就可以了,记得加上file:///,并且在你的共享地址前面加上\进行转义,所以url的值应该看起来是这样的:
file:///\\hostname\file_path
当你共享了自己的仓库给其他用户之后,记得开启写权限给他们。
还有一个一定要注意的问题,如果你和你组员都需要提交到同样的branch,那么你不能占用那个branch,你必须也重新建立一个branch来进行你的工作。否则,如果其他人要提交的branch在你的工作环境中是check out的状态的话,别人提交会有 unpacker err。

创建标签(Tag)

标签通常是用来标识提交链表(commit ancerstry chain)中的某一点,他和提交(commit)信息绑定在一起。

  1. git tag <tagename>。 这个命令是给当前的提交(commit)打上一个轻量级的标签(tag)。
  2. git tag -a <tagename> -m <tagmessage> 。这个命令是个当前提交(commit)打上一个带有备注的标签(tag)。
  3. git push origin <tagename> 发布标签(tag)到远程仓库
  4. git push origin --tags 发布所有的本地标签(tag)到远程仓库。

推送带特殊字符的分支

需要用反斜杠进行转义

1
git push origin HEAD:bugfix/XXX

解决EOF错误

fatal: The remote end hung up unexpectfataledly | 12.00 KiB/s
early EOF
fatal: index-pack failed

这个错误是读取远程仓库的时候丢失数据或者数据损坏导致的。解决方法是加大缓存: git config –global http.postBuffer 104857600

修改提交(commit)的作者信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="luoyuan800@163.com"
CORRECT_NAME="Gavin Luo"
CORRECT_EMAIL="Gavin.luo@quest.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

之后要使用 git push --force --tags origin 'refs/heads/*' 强制覆盖提交
参考:https://www.hidennis.tech/2016/06/07/git-change-author-email/

修改远程仓库的地址

一个git项目可以有多个仓库, 可以使用命令git remote 列出所有的远程仓库; 使用git remote get-url <仓库名, 比如origin>显示仓库地址。

使用git remote set-url origin <url_path> 来设置指定的仓库地址

HTTP仓库地址中加入用户名和密码

格式为https://username:passwoard@git.address。如果username或者password中包含有特殊字符需要进行转义。 常见的特殊字符为 : : %3A@ : %40 (空隔):%20。其他特殊字符可以自行网上查找

分支覆盖,需要用到强行提交 -f

1
2
git reset --hard origin/branch
git push -f

Git 查看配置

1
2
git config user.name ##查看用户名
git config user.email ##查看邮箱

Git 帐号名密码保持

账户名密码会保存到windows credential里面,如果不小心输错了可能会导致之后一直用这个错误,可以打开控制面板然后修改。

Contents
  1. 1. 安装Git
  2. 2. 基本术语解释
    1. 2.1. Git仓库 - 代码存储的地方
      1. 2.1.1. 本地仓库
      2. 2.1.2. 远程仓库(origin)
    2. 2.2. 分支(Branch)
    3. 2.3. HEAD
    4. 2.4. 提交修改(Commit)
    5. 2.5. 推送(Push)
    6. 2.6. 拉取(Pull)
    7. 2.7. Checkout
  3. 3. 复制(Clone)远程代码到本地
  4. 4. 撤销本地的文件修改
  5. 5. 在某个分支的基础上创建一个新的分支(本地仓库)
  6. 6. 用指定的远程分支更新当前的分支
  7. 7. 关联当前的分支和远程的分支
  8. 8. 修改当前项目提交(commit)的作者名称
  9. 9. 修改上一次提交(commit)的作者
  10. 10. 修改指定提交(commit)的信息(作者或者注释信息)
  11. 11. 查看提交(commit)的记录:
  12. 12. 撤销上一次提交(Commit)
  13. 13. 撤销上一次已经推送(push)上远程仓库的提交
  14. 14. Merge操作
    1. 14.1. 合并(Merge)
    2. 14.2. Cherry
  15. 15. 冲突
  16. 16. 强制覆盖本地文件
  17. 17. 删除没有加入版本控制(untrak)的文件
  18. 18. 分享本地仓库
  19. 19. 创建标签(Tag)
  20. 20. 推送带特殊字符的分支
  21. 21. 解决EOF错误
  22. 22. 修改提交(commit)的作者信息
  23. 23. 修改远程仓库的地址
  24. 24. HTTP仓库地址中加入用户名和密码
  25. 25. 分支覆盖,需要用到强行提交 -f
  26. 26. Git 查看配置
  27. 27. Git 帐号名密码保持