参考资料:

  1. Git工作流和核心原理(b站技术蛋老师)
  2. 给学完Git,还不会用GitHub的朋友们(b站技术蛋老师)
  3. 向一个项目贡献(开源指北)

创建并维护自己的项目

初始化

  • 先远程后本地

先在Github上新建远程仓库(需要创建 README.md ),再把仓库克隆到本地。

1
2
3
4
5
6
git clone https://github.com/jrxiang/test.git
cd test
echo "hello" > abc.md
git add abc.md
git commit -m "Add abc.md"
git push
  • 先本地后远程

先在本地创建仓库,再把它推送到远程仓库上。

1
2
3
4
5
6
git init
git add README.md
git commit -m "first commit"
git branch -M main # 本地git默认分支为master,需与远程仓库保持一致
git remote add origin https://github.com/jrxiang/test.git # origin是远程仓库的别名
git push -u origin main # -u参数设为默认值,后续可直接git push

维护原则

main 分支是最核心的分支,可以理解为项目的稳定版。此时,如果要开发一个新的功能,就要在本地创建一个分支。

1
git checkout -b featureA

接下来,对应的功能就在 featureA 分支上完成,完成后再合并到 main 分支。

1
2
git switch main
git merge featureA

参与别人的项目

私有化团队

一般都会采用类似 SVN 的集中式工作流程,即几个程序员共同在 master 分支上做开发。对于快速迭代,成员少的小项目来说,不失为一种好用的方式。

每个人都将远程仓库 clone 到本地,开发各自的功能。

然后经过git addgit commitgit push到远程仓库。

例如:现有甲乙两人,他们都克隆了项目,并且分别改了新增和修改的脚本文件并提交,此时没有任何问题。如果二人同时修改了delete脚本,那么第二个人提交时会出现冲突。此时需要使用 git fetch拉取远程变更,然后处理冲突后再提交。修改 delete 脚本,提交推送到远程仓库。

私有管理团队(Branch PR)

克隆仓库

1
2
git clone https://github.com/username/repo.git
cd repo

创建新分支

为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支:

1
2
git checkout -b new-feature # 创建新分支并切换到该分支
git checkout new-feature # 切换到该分支

暂存文件并提交更改

将修改过的文件添加到暂存区,以便进行下一步的提交操作:

1
2
3
git add filename
# 或者添加所有修改的文件
git add .

将暂存区的更改提交到本地仓库,并添加提交信息:

1
git commit -m "Add new feature"

拉取最新更改

在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突:

1
2
3
4
5
6
7
8
9
10
# 先更新本地 main,拿到团队最新改动
git checkout main
git pull origin main

# 返回功能分支,将本地 main 的最新内容合并或变基进来
git switch new-feature
git merge main # 或者 git rebase main

# 如果远程已有同名功能分支,顺带同步它
git pull origin new-feature # 建议先git fetch

这样做可以在本地尽早发现冲突、验证新旧代码能否协同工作,再推送到远程,避免把问题留到 Pull Request 或主分支合并时才暴露。

推送更改

将本地的提交推送到远程仓库:

1
git push origin new-feature

创建Pull Request(PR)

在 GitHub 或其他托管平台上创建 Pull Request,邀请团队成员进行代码审查。PR 合并后,你的更改就会合并到主分支。

合并更改

在 PR 审核通过并合并后,可以将远程仓库的主分支合并到本地分支:

1
2
3
git checkout main # 切换到本地的main分支
git pull origin main
git merge new-feature # 把新功能整合到主分支中

删除分支

如果不再需要新功能分支,可以将其删除:

1
git branch -d new-feature

或者从远程仓库删除分支:

1
git push origin --delete new-feature

派生的公开项目(Fork PR)

找到一个公开项目点击 Fork。

在自己的派生仓库上进行修改开发(注意要新建一个分支),接下来类似于Branch PR,即开发完成后推送到自己的派生仓库中,这时候再进行PR。

常用指令

注:windows中用",linux中用'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 仓库初始化与克隆
git init # 初始化一个新的Git仓库
git clone git://github.com/someone/some_project.git some_project # 将URL地址的远程版本库克隆到本地some_project目录下
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件

# 查看状态与日志
git status # 查看当前工作区和暂存区的状态
git log # 查看提交历史记录,加上--oneline获得简介输出

# 文件跟踪、添加与提交
git add abc.txt # 将文件添加到暂存区
git add . # 将所有修改文件添加到暂存区
git commit -m "first commit" # 提交暂存区的更改到本地仓库
git commit -am "xxx" # 将add和commit合为一步

# 分支管理
git branch # 列出本地所有分支
git branch main # 创建新分支,但不会自动切换到该分支
git checkout main # 切换到指定分支
git checkout -b main # 创建并切换到新分支
git merge main # 将指定分支合并到当前分支
git branch -M main # 将当前分支重命名为main

# 远程仓库操作
git remote # 查看已添加的远程仓库列表
git remote add origin https://github.com/Thomas-Bob/test.git # 将本地仓库与远程仓库关联起来
git push -u origin main # 将本地的提交推送到远程仓库,其中-u的作用是将本地分支与远程分支关联起来,这样以后在使用git push或git pull时可以省略远程仓库名和分支名
git push origin main # 将本地分支推送到远程仓库
git pull origin main # 从origin仓库拉取main分支的最新提交并自动合并

# 比较、还原与撤销操作
git diff # 查看文件修改的具体差异
git reset README.md # 将文件从暂存区移除,但文件修改本身还在
git reset --hard <commit> # 将工作区和暂存区回退到某个提交(是git commit的提交),会直接回退文件内容,<commit>通过git log来看最前面的hash值(HEAD -> main表示最新提交)

# 临时保存和恢复修改
git stash # 将当前未提交的修改存储起来,恢复到干净的工作区
git stash pop # 应用最近一次存储的修改并将其从stash列表中移除

# 标签管理
git tag # 列出所有标签
git tag -a v1.0 -m "version 1.0" # 给当前提交打上标签,使用-a参数添加带有说明的标签

# 获取远程更新
git fetch # 从远程仓库获取最新的分支和提交,但不会自动合并,需要手动合并或检查