git主要是做版本控制。涉及个人和团队对内容的编辑、管理、共享。
一、概念
1.1 工作目录区【个人】
个人对文件进行修改、编辑,git对该目录没有进行版本控制。
1.2 暂存区【预备提交的内容】
git add 从工作目录去到暂存区。可供选择性的准备提交,把一组更改打包成一个逻辑单元,以便更好地组织历史记录。
1.3 仓库
1.3.1 本地仓库【个人和团队对接】
git commit 更改暂存区的文件会被转移到本地存储区域。形成一个新的提交对象。
1.3.2 远程仓库【团队】
git push 将本地仓库的更改 推送到 远程仓库。
1.3.3 "本地仓库"和"本地仓库的远程跟踪分支"之间的区别
它们是git中两个不同的概念。
本地仓库是项目的主要存储库。用于实际的开发、操作,包括编辑、提交、合并。
本地仓库的远程跟踪分支,是本地仓库的分支,用于跟踪远程仓库的分支。
本地仓库的远程跟踪分支,是只读的,用于存储远程仓库的状态信息,但不能在上面进行直接的编辑或提交。
git push用的是本地仓库
1.4 分支
本地最起码有两个分支。如下。
1.4.1 本地分支(local branch)
本地分支是在本地仓库中创建的分支,用于开发、保存更改、合并等操作。
本地分支值存在于本地仓库中,它们不直接与远程仓库同步。可在本地创建多个分支,进行不同任务的开发。
1.4.2 本地仓库的远程跟踪分支(local remote tracking branch)【反映远程仓库的最新状态】
本地仓库的远程跟踪分支,是本地仓库的分支,用于跟踪远程仓库的分支状态。
本地远程跟踪分支通常以 origin/
前缀命名,例如 origin/master
git fetch 从远程仓库拉取内容,更新本地仓库的远程跟踪分支以反映远程仓库的最新状态。不影响工作区和暂存区。(更新本地仓库的远程仓库信息)
实际操作:远程仓库拉取分支,通常会将远程分支的内容存储在本地仓库的远程跟踪分支中。然后可以选择将这些更改合并到你的本地分支中。
二、提交及提交历史
2.1 普通提交
git commit 用于创建显示的普通提交,代表一次代码的更改或者提交。
普通提交创建的提交历史是线性的,每个提交都有一个父提交,提交历史相对简单。
2.2 合并提交 git merge
合并提交是合并分支时git自动创建的一个特殊类型的提交。
提交历史会相对复杂。git merge。
2.3 重放提交 git rebase
也有合并,但无合并历史记录。
2.4 提交历史
git rebase和git merge的提交历史不一样。
git rebase重新整理提交历史,创建一个线性的提交历史,无合并历史。
git merge会创建合并提交,产生合并点,保留分支的合并历史,明确的记录信息。
不建议在master分支进行git rebase,因为rebase会重新应用提交历史,导致本地的历史和远程仓库、其他的开发者历史不一样,工作会变的混乱。
2.5 HEAD指针
head是git的一个指针,它指向当前所在本地仓库分支或最新提交(或者说当前分支的"顶端")
即git commit后创建一个新的提交对象后,将它添加到当前分支的分支历史中,并将HEAD更新到新的提交上,以反应当前的位置。
git status 用于显示当前head指针指向的本地仓库分支位置;工作目录区、暂存区的信息,即了解当前工作目录区和本地仓库的状态,进而有效的提交和管理。
二、解读如下操作
1. 案例一
git commit --amend对之前的一个到本地仓库的提交进行修改。git push时,提示之前的那个提交已经废弃。
$ git add build_verify_test.sh
$ git commit --amend
$ git push origin HEAD:refs/for/2d-yf
** [ERROR] 下列commit对应评审已废弃或已合入 (原因分析详见 https://dwz.cn/ushdMKjn ):
评审号: 109453255, commit: 4e03fbc, 已合入
[ 请使用以下命令重新提交 ]:
git fetch
git reset --soft origin/2d-yf
git commit -m "您的commit提交说明"
git push origin HEAD:refs/for/2d-yf
重提新评审后,对于存在问题的评审,可酌情废弃
<== .)
error: 推送一些引用到 'ssh://icode.baidu.com:8235/baidu/sapd-qa/adh' 失败
解决方案:
想要把这次的提交合并到目前远程的分支提交上。所以
1、先git fetch 把远程仓库的内容下载同步的本地仓库。
2、本地仓库head指针原来git commit --amend的提交上。实际上需要将Head恢复到和远程内容一致的提交上。 git reset --soft origin/2d-yf 即把HEAD指针移动到远程分支origin/2d-yf的位置。--soft参数表示工作目录和暂存区内容都会保留。
3、上面保留了本地暂存区的修改,以及基于远程仓库的修改,git commit重新创建一个提交,从暂存区到本地仓库
4、把本地仓库 git push到远程仓库。
2. 案例二、git push完但没有手动合并,怎么撤回?
实际起作用:
git reset --soft origin/2d-yf && git commit -m “xxxx. 然后再push.
3. 总结:git reset --soft origin/2d-yf作用
作用:
1、移动指针:git reset --soft 将当前的分支的指针,移动到本地仓库的远程跟踪分支'origin/2d-yf'上所指定的提交上。
2、--soft 保存工作区和暂存取。
3、
此时,可以进一步处理工作目录中的更改,使用git commit提交更改。
将本地仓库的HEAD移动到与远程分支origin/2d-yf一致的提交,但是保留工作目录和暂存区内容。以便进行新的提交或与远程分支进行合并,同时保留本地更改。
4. git pull
git pull是git fetch和git merge或者git pull --rebase两个操作的组合。
git fetch获取远程仓库的最新更改 到 本次仓库的远程跟踪分支上。
git merge将本地仓库的远程跟踪分支合并到本地分支上。
如果合并操作成功,git会自动化创建一个合并提交。
git pull --rebase,将本地提交在远程分支的最新提交上重新应用。不是合并提交,而是重放(rebase)提交。