推荐阅读 git - 简易指南

Git工作流

​ ​ 本地仓库由 git 维护的三棵“树”组成。

  • 第一个是你的工作目录,它持有实际文件;

  • 第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;

  • 最后是 HEAD,它指向你最后一次提交的结果。

创建新仓库

​ 创建新文件夹,打开,然后执行

git init

克隆仓库

​ 执行如下命令以创建一个本地仓库的克隆版本:

git clone /path/to/repository

​ 如果是远端服务器上的仓库,你的命令会是这个样子:

git clone https://github.com/epleone/epleone.github.io.git

添加和提交

​ 你可以提出更改(把它们添加到暂存区),使用如下命令:

git add <filename>
git add *
git add ./

​ 这是 git 基本工作流程的第一步。

​ 使用如下命令以实际提交改动:

git commit -m "代码提交信息"

​ 现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

推送改动

​ 你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:

git push origin master

​ 可以把 master 换成你想要推送的任何分支。

​ 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin <server>

​ 如此你就能够将你的改动推送到所添加的服务器上去了。

分支

​ 分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

​ 创建一个叫做“feature_x”的分支,并切换过去:

git checkout -b feature_x

​ 切换回主分支:

git checkout master

​ 再把新建的分支删掉:

git branch -d feature_x

​ 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:

git push origin <branch>

更新与合并

​ 要更新你的本地仓库至最新改动,执行:

git pull

以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。

要合并其他分支到你的当前分支(例如 master),执行:

git merge <branch>

​ 在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:

git add <filename>

​ 在合并改动之前,你可以使用如下命令预览差异:

git diff <source_branch> <target_branch>

标签

​ 为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:

git tag 1.0.0 1b2e1d63ff

​ 1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:

git log

​ 你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。

log

​ 如果你想了解本地仓库的历史记录,最简单的命令就是使用:

git log

​ 你可以添加一些参数来修改他的输出,从而得到自己想要的结果。 只看某一个人的提交记录:

git log --author=bob

​ 一个压缩后的每一条提交记录只占一行的输出:

git log --pretty=oneline

​ 或者你想通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签:

git log --graph --oneline --decorate --all

​ 看看哪些文件改变了:

git log --name-status

​ 这些只是你可以使用的参数中很小的一部分。更多的信息,参考:

git log --help

替换本地改动

​ 假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:

git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

git fetch origin
git reset --hard origin/master

多账号管理

# 查看全局配置信息
git config --global --list

# 查看当前账号信息
git config --list

# 查看指定键值
git config --global <key>
git config <key>

# 指定key为 user.name
git config --global user.name

# 检查本地仓库的远程设置
git remote -v

在正确切换账号后,push代码提示 fatal: unable to access XXX, The requested URL returned error:403

打开控制面板->凭据管理器->Windows凭据

普通凭据中找到github的凭据后, 删除它, 然后重新到仓库执行git push origin master去提交你的代码, 它会让你填写GitHub的用户名和密码, 填写正确后, 即可进行正常推送

参考自: https://blog.csdn.net/qq_36852780/article/details/107374275

MR/PR流程

MR的一般流程(gitlab)

本地创建分支推送改动到服务器,合并后会删除分支。合并到主分支后,你本地切换到master分支,然后拉取master最新版。这个流程中,reviewer可能对dev分支修改的内容提出建议,或者也可以直接增加修改。

从仓库下载

git clone https://git.xxx.com.cn/xxx

本地修改并提交

# 创建并切换到新的分支`dev`,用于递交合并
git checkout -b dev

# 修改相关内容
# vim xxx.py

# 添加修改到缓冲区
git add ./
git commit -m "xxx"

# 将分支push到服务器
git push -u origin HEAD

gitlab创建并提交 MR(PR)

注意:Assignee 负责merge, Reviewer负责看代码,但没有Merge权限。

本地收尾操作

等到改动被主干版本吸收(中间可能会经过反复修改),本地同步master最新版,并删除dev分支。

# 本地切换到master版本并同步远程修改
git switch master
git pull

# 删除本地dev
git branch -d dev

PR的一般流程(github)

如果你想深入了解 PR 开发模式,可以参考 GitHub 官方文档

Fork 项目

当你第一次提交 PR 时,需要先 Fork 项目到自己的 GitHub 账号下。点击项目右上角的 Fork 按钮,将项目 Fork 到自己的 GitHub 账号下。 接着,你需要将你的 Fork 仓库 Clone 到本地,然后添加官方仓库作为远程仓库:

# Clone 你的 Fork 仓库到本地
git clone https://github.com/username/mmpose.git

# 添加官方仓库作为远程仓库
cd mmpose
git remote add upstream https://github.com/open-mmlab/mmpose.git

Clone 你的 Fork 仓库到本地

git clone https://github.com/username/mmpose.git

添加官方仓库作为远程仓库

cd mmpose
git remote add upstream https://github.com/open-mmlab/mmpose.git

在终端中输入以下命令,查看远程仓库是否成功添加:

git remote -v

如果出现以下信息,说明你已经成功添加了远程仓库:

origin	https://github.com/{username}/mmpose.git (fetch)
origin	https://github.com/{username}/mmpose.git (push)
upstream	https://github.com/open-mmlab/mmpose.git (fetch)
upstream	https://github.com/open-mmlab/mmpose.git (push)

备注

这里对 origin 和 upstream 进行一个简单的介绍,当我们使用 git clone 来克隆代码时,会默认创建一个 origin 的 remote,它指向我们克隆的代码库地址,而 upstream 则是我们自己添加的,用来指向原始代码库地址。当然如果你不喜欢他叫 upstream,也可以自己修改,比如叫 open-mmlab。我们通常向 origin 提交代码(即 fork 下来的远程仓库),然后向 upstream 提交一个 pull request。如果提交的代码和最新的代码发生冲突,再从 upstream 拉取最新的代码,和本地分支解决冲突,再提交到 origin。

VS Code

在VS code中,建议使用Git Graph插件管理git, 非常方便。