常用命令
git clone <版本库的网址> <本地目录名></本地目录名></版本库的网址> git log // 查看看commit历史记录 git add & git commit //提交当前工作空间的修改内容到索引库中 git revert version //还原一个版本的修改,必须提供一个具体的Git版本号 version git tag version //可以将某个具体的版本打上一个标签这样你就不需要记忆复杂的版本号哈希值了 git branch //查看当前分支 git brance -a //查看所有分支 git branch test //就新建了一个名字叫 test 的分支 git checkout -b test //这个命令的意思就是新建一个test分支,并且自动切换到test分支 git checkout test //切换到test分支 git branch -d test //把test分支删除了。 git branch -D test //强制删除test分支
git push --force origin //如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送 到远程主机。这时,如果你一定要推送,可以使用–force选项。上面命令使用–force选项,结果导致远程主机 上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用–force选项。 git fetch //相当于是从远程获取最新版本到本地,不会自动merge(更新remote索引,获取远程服务器的最新分支) git pull //相当于是从远程获取最新版本到本地,会自动merge git push origin :a //删除远程分支 对应语法为:git push [远程库名] [本地分支]:[远程分支] 即向待删除远程分支推送一个空的本地分支。 git stash //备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次 提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 git stash pop //从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash 的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
rebase 和 merge的区别
流程示例
从图中可以看到,这里生成了一个新的提交G,是怎么生成的呢?merge
命令 它会把两个分支的最新快照(F、E
和 D、E
)以及二者最近的共同祖先(B
)进行三方合并,合并的结果是生成一个新的快照G
(并提交)。
当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
结论
- merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容
- merge 的提交历史记录了实际发生过什么,关注点在真实的提交历史上面
- rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面
- rebase 操作会丢弃当前分支已提交的 commit,故不要在已经 push 到远程,和其他人正在协作开发的分支上执行 rebase 操作
- merge 与 rebase 都是很好的分支合并命令,没有好坏之分,使用哪一个应由团队的实际开发需求及场景决定
使用场景
git和rebase这两者哪种操作更好,这是取决于不同的场景的。
当我们拉取公共分支最新代码的时候建议使用rebase,也就是git pull -r
或git pull --rebase
,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了。(如果使用merge,多出无意义的一条提交记录)。
往公共分支上合代码的时候,使用merge。(如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了)
实战技巧
一、提交的Commit超过100M
如果您已经将大文件添加到仓库并提交了更改,您需要从 Git 历史记录中删除它。这可以通过使用 git filter-branch
来完成。以下是使用 git filter-branch
的示例:
brew install git-filter-repo
git filter-repo 提示您这不是一个新克隆的仓库,因此默认情况下,它不会在当前仓库上执行破坏性操作。为了解决这个问题,您有两个选择:
1.在新克隆的仓库上运行命令:这是首选的解决方案,因为它更安全。首先,克隆您的仓库到一个新的文件夹:
git clone <repository_url> <new_folder>
将 <repository_url> 替换为您的仓库的 URL,将 <new_folder> 替换为新克隆仓库的目标文件夹。然后,进入新文件夹并再次运行 git filter-repo 命令:
cd <new_folder> git filter-repo --invert-paths --path <file_name>
2.使用 --force 选项:如果您确定要在当前仓库上进行操作并愿意承担风险,请使用 --force 选项强制执行命令:
git filter-repo --invert-paths --path <file_name> --force
参考文章
全网最通俗易懂的讲解: git rebase和git merge的原理和区别 [ 建议收藏]