git总结

fork的仓库合并代码

merge的三种方式

在git中分支merge通常有三种方式(在github上提交pr给原作者, 合并的方式也是这三种)

普通的merge

这是入门级别的merge方式。基本只要了解这种方式就会知道该命令。
这种方式会保留所有的信息, 在稍微大点的项目中就不行了。因为他会把所有的commit都保留下来,比如说两个分支的merge信息也会保留下来。
下图就是这种merge带来的繁琐graph
normal_merge

squash merge (推荐)

squash merge 是github上常用的merge方式。通常一个pr会有多个commit, 有些commit是对上一个commit的调整(比如说上一个commit的代码不符合pep8, 然后这个commit对上一个commit进行modify)。我们按照普通的merge进行merge的话,回报这些繁琐的信息保留下来, 这是不好的。这个时候我们需要将这个pr的多个commit合并为一个commit, 并选择一些信息作为最终commit的信息。这个时候就需要squash merge了

rebase merge (推荐)

普通merge会保留许多合并点, 但是我们并不想看到这些点, 而是只想看到一条线的提交记录。
比如下图这样的
rebase_merge

这个时候我们可以使用rebase merge。他会使用rebase将commit合并为一条线, 这样可以保证相对来说比较简洁

比较好的博客
merge的三种合并方式
git rebase详解
git rebase
squash merge

删除远程分支后, branch -a 还是能看到的解决办法

问题的重现:
假设现在有个仓库owner/one_project, 然后我clone一个到我的github上my/one_project。现在我在本地新建一个分支dev_fixbug并修改代码、add、commit、push到my/one_project。然后我们建立一个pr将dev_fixbug提交给owner/one_project。 owner在rebase merge了我们的代码后, 我们可以将这个dev_fixbug在github上直接delete掉, 或者本地执行git push origin --delete dev_fixbug。这个分支在远程remote上确实被删掉了。但是我们本地依然还会保留着remotes/origin/dev_fixbug(使用git branch -a即可查看)
解决办法是:

1
2
$ git remote show origin // 查看远程分支, 既可以查看到删除分支的情况
$ git remote prune origin // 删除了本地的remotes/origin/dev_fixbug

这个时候我们使用git branch -a会发现remotes/origin/dev_fixbug被删除掉了

git fetch vs git pull

两者都是用来从remote上拉取代码的
git pull 可以粗略的理解为git fetch && git merge
讲解区别的比较好的博客详解git fetch与git pull的区别

syncing a fork

保持fork的项目同原始项目同步
github官方文档
(其实在github上的最简单的姿势是取upstream所在的仓库, 然后点击fork,github就会将你的仓库同upstream仓库同步)

pull request代码到别的仓库

标准姿势如下

    1. 假设该仓库为owner/repo.git, 首先要做的是fork该仓库到我们的账户下, 假设fork之后是my/repo.git
    1. 将我们的仓库clone下来
    1. 新建一个分支, 写代码, add, commit, push。
    1. 在github上将pr提交给owner, 待owner将分支合并到master即可将新建的分支在远程删掉

上面的姿势的好处有如下几点:

    1. 我们不用将owner所拥有的远程仓库添加到我们本地代码作为upstream, 同步代码我们只需要在owner所在仓库的github主页上点击fork即可。
    1. 因为我们使用的分支是新建的分支, 我们在github上fork代码去做同步, 然后pull下来是不影响新建的这个分支的, 同时我们可以使用merge将主分支的修改合并到新建的分支上保持同步。
    1. 因为我们使用的是新建的分支, 这个分支被owner所接受后。我们在owner点击fork同步代码不会被该新建的分支所干扰(如果我们使用的是master分支做pull request的话, 我们提交后, 如果做同步代码的话会发生upstream的master合并到origin的master上面, 因为我们的master提交记录和owner上的提交记录不一致了。使用新建的分支做pr, 这样会使得我们的master分支始终和owner的master分支的log一致)

git 服务搭建系统

gogs