使用Git开发指南
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.代码冲突
良好的习惯可以避免冲突,或者减少代码冲突的概率。当发现代码有冲突时,你需要做的,就是手动处理你冲突代码。解决步骤如下:
-
清理你的分支,提交需要的修改。
-
回到 master 分支,并从远程拉取最新的 master 代码
git checkout master # 如果无法切换到master分支,请详细阅读 `9. 切换分支的内容`
- 回到你自己的分支并更新你的基础代码
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
来处理,merge
和rebase
稍有区别,本质都是合并,为了让管理员能够直接合并你的代码,不产生冲突,原理就是你先自己与目标分支合并(如果没有冲突,管理员合并就不会有冲突),再提交管理员合并,以保证合并效率。merge
合并会产生新的提交记录,记录内容是某某合并了某个分支到本分支,rebase
不存在提交记录,直接更改基板代码。merge
更利于追溯责任,节点比较多,比较混乱,rebase
的提交记录会更加美观清晰,如果在Linux上结合tig
命令,将会看到rebase
的树形结构更加令人愉悦。