参考资料:
- Git工作流和核心原理(b站技术蛋老师)
- 给学完Git,还不会用GitHub的朋友们(b站技术蛋老师)
- 向一个项目贡献(开源指北)
创建并维护自己的项目
初始化
先在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 add、git commit、git 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 # 从远程仓库获取最新的分支和提交,但不会自动合并,需要手动合并或检查
|