虽然目前 Git GUI逐渐更加完善,现在有很多好用的图像用户操作界面,但是对于初学者来说需要完全掌握基础知识点,最开始应该接触 Git 命令,它是基础,在后续的团队协作过程中可以给你的增加很多的效率。
1. 提交变更信息到暂存区
/*. 将单个文件修改添加到本地暂存区 */
git add xxx.swift
/* .将多个文件修改添加到本地暂存区 */
git add xxx.swift xx.swift
/* .将目前所有变更的修改都添加到本地暂存区 */
git add -a
2. 提交变更日志
git comment -m "[Clean] 变更信息"
3. 推送日志到远程仓库
这里推送的远程仓库可以是Github, Gitee, Gitbicket等远程仓库,具体看你这边本地配置
git push origin <branch-name>
如果本地仓库与远程仓库存在冲突,不考虑数据冲突问题,你可以强制推送
git push origin <branch-name> --force
4. 撤回提交记录
如果你已经提交了代码并且想要在本地撤回提交,有几种方法可以选择,这取决于你是否已经将提交推送到远程仓库
4.1 使用 git reset 撤回提交
- 如果你只是想撤回最后一次提交,并且保留文件中的更改:
git reset --soft HEAD~1
- 撤回最后一次提交(删除更改)
如果你想撤回最近的提交并删除提交中的所有更改,可以使用以下命令:
git reset --hard HEAD~1
这个命令不仅会撤回提交,还会丢弃你在那个提交中所做的所有更改。
- 撤回多个提交
如果你想撤回多个提交,可以使用以下命令(例如撤回最近的 3 次提交):
git reset --soft HEAD~3
或者
git reset --hard HEAD~3
4.2 使用git revert撤回提交
git revert 是一种更安全的方法,尤其是在提交已经推送到远程仓库后。它会生成一个新的提交来撤销指定的提交,而不会更改提交历史。
- 撤回最后一次提交
git revert HEAD
这个命令会生成一个新的提交,该提交将撤销最后一次提交的更改。
- 撤回特定的提交
如果你想撤回某个特定的提交,可以指定该提交的哈希值:
git revert <commit-hash>
如果提交已经推送到远程分支,使用 git reset 可能会导致远程仓库与本地仓库的分支不同步。在这种情况下,建议使用 git revert。
使用 git reset 或 git revert 来撤回已经提交的记录。git reset 更适合本地撤回和更改,而 git revert 更适合已经推送到远程仓库的提交撤回。
5. 移除缓存区中的修改
这种移除指的是提交到缓存区但是没有git commen的记录
5.1 使用 git restore 命令
git restore 是 Git 2.23 版本中引入的一个命令,用于更轻松地恢复工作区或缓存区中的文件。
- 移除单个文件的缓存区修改:
git restore --staged <file>
- 这将把指定的文件从缓存区移除,但文件本身在工作区中的更改不会被丢弃。
- 移除所有文件的缓存区修改:
git restore --staged .
- 这会将所有已经添加到缓存区的文件移除,但不会影响工作区中的文件内容。
5.2 使用 git reset 命令
在 git restore 之前,git reset 是移除缓存区中文件更改的常用方法。
- 移除单个文件的缓存区修改:
git reset <file>
- 这将把指定的文件从缓存区移除,但保留工作区中的更改。
- 移除所有文件的缓存区修改:
git reset .
- 这将把所有已经添加到缓存区的文件移除,同样保留工作区中的更改。
6.创建分支
创建分支大多数是基于问题或者业务去从主分支中拆分出来新的开发代码分支.
/* 创建新的代码分支 */
git branch <branch-name>
/* 切换分支 */
git checkout <branch-name>
/*. 创建分支并且切换到分支 */
git checkout -b <branch-name>
/*.删除分支 */
git branch -d <branch-name>
/*.删除远程代码分支 */
git push origin --delete <branch-name>
7. 合并分支
合并分支是将一个分支的更改整合到另一个分支中,通常用于将新功能或 bug 修复合并到主分支(如 main)中。
合并分支的步骤
1.切换到你希望将更改合并到的目标分支:例如,切换到 main 分支:
git checkout main
2.执行合并:将 feature/new-feature 分支合并到 main 分支:
git merge feature/new-feature
3.如果没有冲突,Git 会自动将更改合并到 main 分支中。
另一种思路就是如果你这边想把你的开发分支 Feature合并到主分支 main,你可以进行下面步骤:
-
开发分支 merge 主分支
-
分发分支处理冲突提交 commit,提交远程仓库
-
远程仓库在开发分支上发送 pull request 拉取请求给主分支,主分支进行代码审核。
8.处理合并冲突
有时,Git 无法自动合并更改,这时会发生冲突。Git 会在发生冲突的文件中插入冲突标记,表明需要手动解决冲突。
- 手动解决冲突:打开冲突文件,按照标记手动选择或编辑代码,确保合并后的代码是正确的。
- 标记冲突已解决:解决冲突后,添加这些文件到缓存区:
git add <file>
- 完成合并:最后,提交合并更改:
git commit -m "提交信息"
git rebase 是 Git 中一个强大的工具,它允许你重新整理提交历史,使得项目的提交历史更为线性和整洁。rebase 是对比 merge 的一种替代方案,用于将一个分支上的更改应用到另一个分支上。
9.变基不常用
git rebase 本质上是将一个分支中的一系列提交“移动”到另一个基础提交之上。具体来说,它将你的分支从当前基点(例如 feature 分支的起始点)重新定位到新的基点(例如 main 分支的最新提交)。
将其他分支(Feature)上提交的修改变基到目前所在的分支(main),在当前分支(main)处理冲突,这样可以避免 Feature 分支上污染
| 变基前 | 变基后 |
|---|---|
变基后Git Push,Feature分支将会被删除
9.1 git rebase 的基本使用
最常见的使用场景是将一个特性分支的更改“rebase”到主分支的最新状态上:
git checkout feature-branch
git rebase main
这将会:
- 切换到
feature-branch。 - 将
feature-branch上的所有提交,基于main分支的最新提交之上,这样feature-branch就像是从main的最新提交上分出的。
9.2 与git merge对比
-
git merge:git merge将两个分支的提交历史合并在一起,可能会生成一个新的“合并提交”(merge commit),从而保留了所有分支的提交历史。 -
git rebase:git rebase不会产生新的合并提交,而是通过重新排列提交历史,使得项目历史更加线性,看起来像是一个分支直接跟在另一个分支之后。
9.3 git rebase的好处
- 保持线性历史:使用
rebase可以让项目的提交历史看起来更清晰,避免了合并提交的杂乱。 - 提高历史可读性:项目历史更容易理解,因为每个分支的开发流程是线性的。
9.4 git rebase的潜在问题
-
冲突处理:在
rebase过程中,可能会遇到冲突,你需要手动解决这些冲突。解决冲突后,你需要使用git rebase --continue继续操作。 -
历史重写:
rebase实际上是在重写提交历史。如果你已经将分支推送到共享的远程仓库,那么在执行rebase后,你的本地分支和远程分支将不再同步,这可能导致困惑或问题。尤其是在与其他开发者协作时,尽量避免在已经公开的分支上使用rebase。
9.5 git rebase的工作流程
假设你有以下的提交历史:
main: A---B---C---D
feature: E---F---G
你可以使用 git rebase main 将 feature 分支的提交重新定位到 main 分支的最新提交 D 之后:
git checkout feature
git rebase main
执行 rebase 之后,提交历史将变为:
main: A---B---C---D
feature: E'---F'---G'
这表明 feature 分支上的所有提交都已重新应用到 main 分支的最新提交 D 之后。
9.6 git rebase -i交互式rebase
使用 git rebase -i(交互式 rebase)可以让你更细致地控制提交历史。你可以在 rebase 的过程中重新排列、合并、编辑或者丢弃某些提交。
git rebase -i HEAD~3
这个命令会打开一个交互式编辑器,你可以在其中修改最近 3 个提交的顺序,合并提交,修改提交信息等。
9.7 rebase后推送
在执行 rebase 后,如果你想推送更改到远程仓库,通常需要使用 --force 或 --force-with-lease 选项:
git push --force
或者更安全的:
git push --force-with-lease
--force-with-lease 选项会确保远程分支没有被其他人修改过,否则推送将被拒绝,从而避免覆盖其他人的工作。
git rebase是将一个分支的更改重新应用到另一个分支的最新提交之上,使提交历史线性化。
与git merge相比,rebase不会产生合并提交,历史记录更简洁。
git rebase -i允许你以交互方式编辑提交历史,使其更具可控性。
使用rebase时要小心,避免在共享的分支上使用,因为它会重写提交历史,可能导致协作问题。
git rebase 是一个强大的工具,但要小心使用,特别是在团队协作的环境中。如果使用得当,它可以让你的 Git 提交历史更加简洁、清晰。
疑难杂症
HEAD detached from 8c21063
git操作过程中出现类似提示,表示你的 Git 仓库当前处于一个“分离的 HEAD”状态(detached HEAD)。这通常发生在你检出(checkout)一个特定的提交而不是分支的时候,例如通过 git checkout <commit-hash> 直接检出了 8c21063 这个特定的提交哈希。
这时候你可以通过 git branch 查看目前分支,然后通过 git checkout 切换到指定分支进行工作.
注意:文档持续更新中...