1 介绍

本教程简单介绍了GitGUIGitBashTortoiseGit使用HTTP方式克隆/推送版本库以及SSH添加密钥的方法。
本教程使用的图片部分来自菜鸟教程廖雪峰的官方网站以及阮一峰日志

2 基本概念

  1. 工作区
    电脑里能看到的目录。
  2. 暂存区
    存放于隐藏文件夹.git中的index文件,也叫作索引区。
  3. 版本库
    隐藏文件夹.git.git不属于工作区,而是Git的版本库。

VQ5Il3zE4cfg2J6

3 分布式工作流程

3.1 集成管理者工作流

有一个主仓库和若干个公开仓库,每个开发者需要先从主仓库克隆出自己的公开仓库,然后将自己的修改推送上去,然后可以请求主仓库的管理者拉取更新并合并到主仓库,流程如下:

  1. 开发者派生主仓库,此时开发者有自己的远程仓库。
  2. 克隆自己的仓库到本地,做出修改并推送。
  3. 请求拉取自己的更新。
  4. 管理者在自己的本地仓库中,将开发者仓库加为远程仓库并合并修改。
  5. 管理者将合并后的修改推送到主仓库。

3.2 分支开发工作流

只有一个中心仓库,但是有很多分支。只在主分支上保留完全稳定的代码,还可以有一些类似develop或者next的平行分支,可以用来做后续开发或者测试功能稳定性,等这些分支一旦达到稳定状态,就可以合并到主分支了。

3.2.1 创建与合并分支的概念

Git中,你的每一次提交都被Git串成一条时间线,一般来说,这条时间线就是主分支masterGitHEAD指向你当前工作在哪个分支,再用master指向你的当前提交版本,这样就可以确定你的当前分支以及当前分支的提交版本,每次提交master就会向前移动,指向当前提交版本。
GcumqIbF1wiQjPs
当创建一个新分支dev时,其实是新建了一个dev指针,指向master相同的提交,要切换到dev分支就只需要将HEAD指针指向dev就行。
nRVjekbTDv41mwg
从现在起,你对工作区的修改和提交都是针对dev分支,每次提交,都是由dev指针向前移动,指向当前的提交版本。
SedP2Z9C6XwQ5Lm
如果要合并,只需要将master指向dev的当前提交版本就可以了,合并完可以删除dev指针,这样就只剩一条主分支。
sr6AtMvUQlPg2Rk
Git无法自动合并分支时,会提示冲突,此时必须首先解决冲突,将合并失败的文件内容编辑为希望的内容,然后再提交,最后合并完成。

4 使用方法

4.1 Git Bash

Git Bash是通过命令行终端进行项目开发,GitGUITortoiseGit的本质就是用图形化界面对这些命令进行了封装,有些时候还是得通过命令行的方式进行操作。

4.1.1 命令清单

一般来说,日常使用只需要以下6个命令:

tnX3lc2zh5WgdYq

  1. 新建版本库
    1
    2
    3
    4
    5
    6
    7
    8
    # 在当前目录下新建一个Git版本库
    git init

    # 将指定目录其初始化为Git版本库
    git init [project_directory]

    # 克隆一个Git版本库
    git clone [url]
  2. Git配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 查看当前Git配置信息
    git config -l

    # 配置Git用户信息
    git config --global user.email "E-mail_Address"
    git config --global user.name "User_Name"

    # 忽略特殊文件,需要编写.gitnore文件,并放入版本库
    # 忽略原则
    # 1.忽略操作系统自动生成的文件,比如缩略图
    # 2.忽略编译产生的中间文件、可执行文件等
    # 3.忽略存放有敏感信息的个人配置文件

    # 检查gitnore配置文件的问题
    git check-ignore
    点我浏览gitnore配置文件
  3. 增删文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 将指定文件添加到暂存区
    git add [file1] [file2] ...

    # 将指定目录添加到暂存区,包括子目录
    git add [directory]

    # 将当前目录下所有文件添加到暂存区
    git add .

    # 删除工作区文件,并将此次删除放入暂存区
    git rm [file1] [file2] ...
  4. 提交代码
    1
    2
    3
    4
    5
    # 提交暂存区到版本库
    git commit -m [commit_message]

    # 提交暂存区的指定文件到暂存区
    git commit [file1] [file2] ... -m [commit_message]
  5. 分支
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 查看所有本地分支
    git branch

    # 查看所有远程分支
    git branch -r

    # 新建一个分支,但仍处于当前分支
    git branch [branch_name]

    # 新建分支并切换到新分支
    git checkout -b [branch_name]

    # 切换到指定分支
    git checkout [branch_name]

    # 删除指定分支(使用-D来强制删除一个未被合并的分支)
    git branch -d [branch_name]
  6. 标签
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 查看所有标签
    git tag

    # 为当前提交的版本创建标签
    git tag [tag_name]

    # 为指定版本创建标签
    git tag [tag_name] [commit_id]

    # 为指定版本创建带有说明的标签
    git tag -a [tag_name] -m "tag_description" [commit_id]

    # 推送本地标签到远程
    git push [remote_name] [tag_name]

    # 推送所有未推送的本地标签
    git push [remote_name] --tags

    # 删除一个指定的远程标签
    git push [remote_name] :refs/tags/[tag_name]

    # 删除本地标签
    git tag -d [tag_name]
  7. 查看信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 查看所有变更文件
    git status

    # 查看当前分支的版本历史
    git log

    # 查看命令历史
    git reflog

    # 查看暂存区和工作区差异
    git diff

    # 查看任意两个版本之间的改动
    git diff [commit_id1] [commit_id2]

    # 查看任意两个版本的src文件夹的差异
    git diff [commit_id1] [commit_id2] src

    # 查看远程仓库信息,显示可以拉取和推送的地址,如果没有推送权限就看不到推送地址
    git remote -v
  8. 远程同步
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 关联一个远程仓库
    git remote add [remote_name] [url]

    # 下载远程仓库所有变动(到版本库),可以先查看远程仓库的变动再选择是否合并到本地
    git fetch [remote_name]
    git log -p FETCH_HEAD
    git merge [remote_name]/master

    # 拉取指定远程分支的变化并与指定的本地分支合并(不推荐)
    git pull [remote_name] [remote_branch]:[local_branch]

    # 推送本地指定分支到远程仓库
    git push [remote_name] [branch_name]

    # 强行推送当前分支到远程仓库,即使有冲突
    git push [remote_name] -f
  9. 撤销
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 丢弃工作区文件的修改(文件还未添加到暂存区)
    git checkout -- [file]

    # 丢弃工作区文件的修改(文件已添加到暂存区),先撤销暂存区的修改再丢弃
    git reset HEAD [file]
    git checkout -- [file]

    # 重置暂存区的指定文件,与上一次提交保持一致,但工作区不变
    git reset [file]

    # 重置暂存区和工作区,与上一次提交保持一致
    git reset --hard

    # 回退到指定版本
    git reset --hard [commit_id]
  10. 发布版本
    1
    2
    # 将master分支最新节点打包
    git archive --format zip --output [release_name].zip master

4.2 Git GUI

安装Windows版本的Git时,会默认安装一个简单的GUI工具,提供图形化界面。

4.2.1 Git GUI汉化

GitGui汉化项目
将汉化文件拷贝到Git安装目录下的\mingw64\share\git-gui\lib\msgslib下没有msgs文件夹则需要新建一个。
汉化后的GUI界面如下所示:
5KvJwNIGPmongdh
QcsAFSB3ifxHaGl

4.2.2 Git GUI配置

点击编辑,选项,更改文件内容编码为UTF-8
fqDVCPNwF2Abeph

4.2.3 Git GUI使用

4.2.3.1 克隆已有的远程仓库
  1. 单击右键Git GUI Here,克隆一个已有的远程仓库
    j2oZTFngAHLqsGE
  2. 缓存改动到暂存区,然后提交到版本库
    48EWr3spbuC7gSR
    IkVtFc38QLziqyh
    7MBJmOIPA5SiulW
  3. 上传到远程仓库(默认是origin)
    elkWSd4DOb9cEhZ
  4. 从远程仓库获取变动
    A5c4QbgVhFlR78I
  5. 本地合并变动
    kIKZhJYzOloNMF8
    cHdDa2mhqvkUuV7
4.2.3.2 本地上传新的版本库
  1. 创建新的版本库
    PeDA1C4Nls3t7Sf
  2. 上传本地版本库(可填写地址直接上传,无需去远程创建)
    HTTP:http://192.168.3.179/[User_Name]/[Project_Name].git
    SSH:git@192.168.3.179:[User_Name]/[Project_Name].git
    6FsYQrqBoXGTb3v

4.3 TortoiseGit

4.3.1 HTTP方式克隆/推送版本库

4.3.1.1 GitLab及TortoiseGit配置说明
  1. GitLab设置中文
    点击settings
    DhE7MlnGy6VQ5Uj
    选择preference
    CZMasfR4bwBgSuq
    找到Localization并修改Language为简体中文:
    emuz63WFXGIZdLl
  2. TortoiseGit设置
    项目文件夹里单击右键选择TortoiseGit(T) –> 设置
    7axLu8fB6l915oO
    点击编辑全局.git/config,配置自己的信息,加入:
    1
    2
    [credential]
    helper = store
    这是为了记住用户名和密码:
    xFMrjaEJqDSlQY4
4.3.1.2 创建本地版本库
  1. 新建项目文件夹
    GpUmEDeICg2zTfZ
  2. 在项目文件夹里单击右键选择Git在这里创建版本库
    7AQqspx2kK85IMX
4.3.1.3 创建远程仓库

B2qrHydJnigzSY8

4.3.1.4 绑定远程仓库并提交
  1. 克隆仓库地址(使用HTTP克隆)
    mLay7qDvbknHXrT
  2. 单击右键选择Git提交
    (1) 填写日志信息,描述项目文件改动。
    (2) 勾选未受版本控制的文件,即未提交的文件。
    dlZab19yTUVHmBO
    HgxBhywA2XTUVbe
  3. 点击推送(URL为克隆的仓库地址)
    jv9TRHxd7wDIhnZ
    VpAKINCqF95l6wh
4.3.1.5 新建分支与合并

新建一个分支相当于新建了一份备份,比如要添加新功能时,可以在新建的分支里进行测试,测试成功后再合并到主分支,新分支的修改不影响主分支。

  1. 创建分支并切换到新分支
    mIblKvr18XaywqW
  2. 创建newFunction.txt文件用于测试修改
    tSPTF5ixmjoYA9h
  3. 提交修改并推送到新分支v1.0.0
    JZAemwHnDR34F8G
    查看远端仓库可以发现,主分支没有变化,但是有新的分支可以合并:
    lPrbsS9E1tThqxi

注意:
合并新分支到主分支,一般是由项目管理者去合并分支,项目开发者克隆原始版本到本地后,可以新建分支进行开发测试,测试无误后可将此分支提交到远程仓库,由管理者审核后可合并到项目主分支。

4.3.2 SSH添加密钥

只有添加了密钥才能使用SSH URL克隆仓库。

4.3.2.1 检查本机已存在的SSH密钥

右键单击git bash here,输入cd ~/.ssh
提示No such file or directory说明是第一次使用。

4.3.2.2 创建SSH密钥

ssh-keygen -t rsa -C "e-mail address"
持续三次回车,id_rsa是私钥,id_rsa.pub是公钥。
F5r3sk2RvZUf1jY

4.3.2.3 添加SSH密钥

复制id_rsa.pub内容粘贴到密钥文本框:
g5WvBNEmxGMysib