1.账号注册

登录Git的Web地址(具体地址请向管理员索取),注册自己的账号

2.安装Git客户端

打开 https://git-scm.com/downloads 安装Git客户端。

3.生成公私密钥

在任意文件夹内右键,选择 “Git Bash Here”,在终端中执行 ssh-keygen, 一直回车,看到类似如下结果则表示秘钥生成成功。

 ssh-keygen

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/dev/.ssh/id_rsa. # 私钥保存的文件路径
Your public key has been saved in /c/Users/dev/.ssh/id_rsa.pub. # 公钥保存的文件路径
The key fingerprint is:
SHA256:fQQGZm3sKnFJE2/v7gP6C9Ynv5gC3YxO0xw69+hIB98 dev@DEV-PC
The key's randomart image is:
+---[RSA 2048]----+
|        ==o      |
|       ooo+.     |
|       . =o .    |
|      . oooo     |
|       +SO..o    |
|      o O+B+     |
|       =+==+E    |
|       o++.Bo    |
|        .+*o=o   |
+----[SHA256]-----+

4.配置秘钥

打开步骤3生成公钥文件,复制里面的全部内容(公钥信息)。登录GitLab,依次点击右上角”个人头像” ->”设置”->”个人资料”->”SSH Keys”,找到名为 key 的文本输入框,将所复制公钥信息粘贴到其中, 然后点击下方的”添加”按钮即可。

5.配置机器环境

任意对方进入 Git Bash,执行以下命令

 git config --global user.name "John Doe" # 你的身份标识,你的Git用户名,提交代码的时候使用此标记记录你所有的提交记录
 git config --global user.email "xx@163.com" # 你的邮箱信息,填写你注册账号是的邮箱

6. 克隆代码

克隆(clone),用于第一次完整获取仓库默认分支的代码(一般默认是master分支),仅仅是获取默认分支的代码,在你第一次拿到项目仓 库地址的时候执行,或者你想重新获取默认分支的代码到不同目录的时候才执行。命令格式为: git clone 仓库地址,例如:

git clone git@10.0.10.188:hbaf/IntegratedMM.git

# 执行成功后,会在当前的目录下生产一个 IntegratedMM 目录,如果不想使用 IntegratedMM 这个目录,clone 的时候可以取别名,
# 例如取名为 my-project 则执行 git clone git@10.0.10.188:hbaf/IntegratedMM.git my-project,就会在当前目录成一个
# 名为 my-project 的目录,里面的内容依然是仓库中的内容

7.代码修改

  • 不管任何时候,拿到一个新的需求,或者需要更新某些内容的时候,先回到 默认分支(一般是 master,或者其他管理员自定义的稳定版本的分支),从远程仓库获取最新的代码,之后在最新的代码基础上切换一个新的分支来做你的更新。
  • 分支的意思可以理解为一个新的独立的工作空间,与其他工作空间的内容是完全不想影响,你可以快速的进入不同的工作空间完成不同的任务。

8. 查看分支

git branch # 查看本地所有的分支

git branch -a # 查看本地和远程仓库的所有分支,一般先执行 git fetch origin 后再执行,结果更加准确

9.切换分支

命令格式: git checkout 已存在的分支名 ,如果分支不存在,则需要加 -b 参数。 切换分支的时候,可能会要求你先提交你当前的修改,否则不允许切换分支,注意看提示, 并不是你执行了命令都能达到是你预期的效果。

分支名尽量做到看到分支名别人就能知道你这个分支是干什么的,也方便你后面维护,不用每次都是一个分支名, 也不要用自己的名字作为分支名,如果英文实在紧张,拼音我们也接受的

常见切换分支失败信息如下:

E:\Repository\Codes\java\IntegratedMM (develop -> origin)                            
λ git checkout master                                                                
error: Your local changes to the following files would be overwritten by checkout:   
src/main/resources/properties/mysql.properties                               
Please commit your changes or stash them before you can switch branches.             
Aborting  

你现在需要做的,要么是提交你的修改,要么放弃你的修改(放弃修改的介绍在后面)。下面给出切换分支的 命令解释。

# 假设你当前在 master 分支
git branch -b  add-data-sync
# 执行之后,会在 master 的基础之上,新建一个名为 add-data-sync 的分支并且进入 add-data-sync 分支,
# 如果 add-data-sync 分支已经存在,此命令将会执行失败

# 假设你当前在 master 分支
git branch add-data-sync
# 如果 add-data-sync 分支存在,则直接进入 add-data-sync 分支,
# 如果 add-data-sync 分支不存在,此命令会执行失败

10. 代码提交

假设你在你的分支上做了很多修改,你现在需要将你做的修改提交到仓库,如果你认为你的代码可靠成熟了,还可以 申请合并到主干分支(一般是master,具体以管理员定义为主)。首先,你需要做的,就是要检查你对哪些文件做了修改,执行 git status 例如:

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   1.txt # modified 标识对应文件内容被修改
        deleted:    2.txt # deleted 标识对应文件已被删除

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        3.txt   # 这里展示的是新增的文件,还没有在git的管理下的文件

no changes added to commit (use "git add" and/or "git commit -a")

如果你想查看那些被修改的文件具体修改了什么地方,执行 git diff 文件1 文件2 ...即可,如果想查看所有的修改, 直接执行 git diff即可。

当你确认你所修改的文件都是必须的,则将他们添加到缓冲区,执行 git add 文件1 文件2 ...,如果你所有的文件都 必须提交,执行 git add .,将所有修改的文件全部添加到缓冲区,如果执行后突然想先不提交某些文件,那么可以执行 git reset 文件1 文件2 ...

git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage) # 执行 git reset HEAD <file> 将从缓冲区中移除相关文件

        modified:   1.txt
        renamed:    2.txt -> 3.txt

# 例如不想提交 1.txt
git reset 1.txt

经历以上操作后,已经把你想要的提交的东西都添加到缓存区,接下来,你需要做的就是给一个标记,并且提交到你本地的 Git仓库。

git commit -m '你本次提交的内容描述,尽量详细' # 执行成功后,你所做的修改就被提交到了本地

至此,本地仓库就有了你的提交记录,但是别人还是没用看到你的修改内容,也为了防止你机器宕机导致代码丢失,建议每次 提交到本地之后,将你的提交推送到远程,推送到远程的命令: git push origin 你的分支名

# 假设你当中在分支 add-data-sync
git push origin add-data-sync  
# 推送成功后,在远程将会出现一个名为add-data-sync的分支,内容与你本地的 add-data-sync 完全一样

git push origin add-data-sync:add-data-sync-remote
#推送成功后,在远程将会出现一个名为 add-data-sync-remote 的分支,内容与你本地的 add-data-sync 完全一样

# 同一个仓库下,如果别人也推送了一个同名的分支,你会执行失败,因为你们的提交历史不同

11.请求合并

在git的web管理界面上,找到你的分支,点击分支后面有个”合并请求”,在弹出的页面中,在 Description 输入本次请求的描述,一般 是你这个分支所有的更新内容描述;在 Assignee选择你想让谁来审查你的代码以及处理你的合并请求; Target branch 选择你的代码想要合并的目标分支(具体以管理员安排,默认都是 master),Target branch后面的Change branches用来 重新选择你的目标分支。完成之后,点击Submit merge request 并通知审查你代码的人员。

12.代码冲突

良好的习惯可以避免冲突,或者减少代码冲突的概率。当发现代码有冲突时,你需要做的,就是手动处理你冲突代码。解决步骤如下:

  1. 清理你的分支,提交需要的修改。

  2. 回到 master 分支,并从远程拉取最新的 master 代码

 git checkout master  # 如果无法切换到master分支,请详细阅读 `9. 切换分支的内容`
  1. 回到你自己的分支并更新你的基础代码
git checkout your-branch

git rebase master

执行之后,可以看到如下提示:

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: sdsa
Using index info to reconstruct a base tree...
M       3.txt
Falling back to patching base and 3-way merge...
Auto-merging 3.txt
CONFLICT (content): Merge conflict in 3.txt  # 英文紧张的同学,记住冒号前面的两个单词,这两个单词表示文件内容冲突,文件时 3.txt
error: Failed to merge in the changes.
Patch failed at 0001 sdsa
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

本来,你在你自己的分支,在Bash中,你的项目名称后面的括号应该显示你的分支名,此时括号里面的内容不再是你的分支名,表示你正处于合并冲突 当中。

打开冲突的文件,冲突的地方都会有标记,例如

<<<<<<< 14a1d90d3fb43a667fddcd78af2eec2596764b7d
aaaa
=======
1111233
1478
>>>>>>> sdsa

解释:

<<<<<<<<<<<<<<<<<<<<<<<
这里是现在 master 的代码
=======================
这里是你自己分支的代码
>>>>>>>>>>>>>>>>>>>>>>>>

如果想保留 master 的代码就删除你自己的代码,如果要保留自己的代码就删除master的代码,一般是保留你自己的代码,不然你修改就丢失了, 处理完所有冲突文件之后,重新将那些冲突文件添加到缓冲区,执行

git add 冲突的文件1 冲突的文件2 ...

完成之后,执行

git rebase --continue

如果项目名称后面的括号里面还没有正常显示你的分支名,说明你还是有冲突要解决。重复上述的解决方式,直到项目名称后面的括号里面正常显示 你的分支名才能表示你已经解决完所有冲突,此时,你再将你的代码推送到远程,此时你本地的这个分支的代码会跟远程的同名分支有重回图,推送 的时候会提示失败,你需要做的就是强制覆盖远程的分支,或者提交到远程的另一个名字的分支

git push origin your-branch -f # 强行将本地的分支替换远程的同名分支,谨慎操作,不要对别人的分支进行这个操作,这个是无法撤回的

完成之后,再次通知相关人员处理合并请求即可。

代码冲突也可以使用 merge来处理,mergerebase稍有区别,本质都是合并,为了让管理员能够直接合并你的代码,不产生冲突,原理就是你先自己与目标分支合并(如果没有冲突,管理员合并就不会有冲突),再提交管理员合并,以保证合并效率。merge合并会产生新的提交记录,记录内容是某某合并了某个分支到本分支,rebase不存在提交记录,直接更改基板代码。merge更利于追溯责任,节点比较多,比较混乱,rebase的提交记录会更加美观清晰,如果在Linux上结合tig命令,将会看到rebase的树形结构更加令人愉悦。