New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

编写「如何给 19wu 贡献代码」指南 #41

Closed
saberma opened this Issue Dec 25, 2012 · 55 comments

Comments

Projects
None yet
9 participants
@saberma
Member

saberma commented Dec 25, 2012

可能有些参与者不知道怎么做。

谁能写一下实例指南,最好有图有真相,从以下几个步骤来讲:

  • 如何 fork 19wu 的源代码
  • 在 issue 中留名,表示你正在做
  • 开始修改代码
  • git commit 时注意要加上 issue 的 id 号,让两者关联
  • 如何提交 Pull Request
@saberma

This comment has been minimized.

Show comment
Hide comment
@saberma

saberma Dec 25, 2012

Member

@Ival 你熟悉 Pull Request 的过程也补充到这里吧

Member

saberma commented Dec 25, 2012

@Ival 你熟悉 Pull Request 的过程也补充到这里吧

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 25, 2012

Contributor

我先把我会的写来吧:

  1. 到 saberma 的 19wu 的github 页面内点击 fork 按钮,位于右上角
  2. 你的帐户中会出现 19wu 这个项目
  3. 本地电脑上, 使用
git clone [你的 19wu 的 github 地址]

,得到一个叫 19wu 的文件夹
4. 进入该文件夹,使用

git remote add upstream https://github.com/saberma/19wu.git

添加 saberma 的远程 19wu 地址
5. 使用

git pull upstream master 

得到目前的 saberma 的代码,现在我们在 master 这个分支上,以后这个分支就留作跟踪 saberma 的远程 19wu 代码
6. 使用

git checkout -b my_change

创建新的分支,我们在这个分支上更改代码
7. 添加代码
8. git 的 workflow:
* git add .
* git commit -m "message need to be added here"
9. 使用

git checkout master

切换到主分支,使用

git pull upstream master 

拉出最新的代码。切换回 my_change 分支,使用

git rebase master

,然后

git push origin my_change 

将代码提交到自己的仓库,这时候去自己 19wu 仓库的页面,点击 pull request。

@saberma 我刚学的,帮我看看

Contributor

lufeihaidao commented Dec 25, 2012

我先把我会的写来吧:

  1. 到 saberma 的 19wu 的github 页面内点击 fork 按钮,位于右上角
  2. 你的帐户中会出现 19wu 这个项目
  3. 本地电脑上, 使用
git clone [你的 19wu 的 github 地址]

,得到一个叫 19wu 的文件夹
4. 进入该文件夹,使用

git remote add upstream https://github.com/saberma/19wu.git

添加 saberma 的远程 19wu 地址
5. 使用

git pull upstream master 

得到目前的 saberma 的代码,现在我们在 master 这个分支上,以后这个分支就留作跟踪 saberma 的远程 19wu 代码
6. 使用

git checkout -b my_change

创建新的分支,我们在这个分支上更改代码
7. 添加代码
8. git 的 workflow:
* git add .
* git commit -m "message need to be added here"
9. 使用

git checkout master

切换到主分支,使用

git pull upstream master 

拉出最新的代码。切换回 my_change 分支,使用

git rebase master

,然后

git push origin my_change 

将代码提交到自己的仓库,这时候去自己 19wu 仓库的页面,点击 pull request。

@saberma 我刚学的,帮我看看

@Ival

This comment has been minimized.

Show comment
Hide comment
@Ival

Ival Dec 25, 2012

Contributor

支持@lufeihaidao,另外推荐一款命令行界面的 git 版本仓库工具:tig

Contributor

Ival commented Dec 25, 2012

支持@lufeihaidao,另外推荐一款命令行界面的 git 版本仓库工具:tig

@saberma

This comment has been minimized.

Show comment
Hide comment
@saberma

saberma Dec 25, 2012

Member

@lufeihaidao 流程写得很详细,我们做过的人一看就知道 了,新手可能还是需要有图片一步步说明会好些。

看下次谁有时间改代码,以实例的方式把过程截图下来。

Member

saberma commented Dec 25, 2012

@lufeihaidao 流程写得很详细,我们做过的人一看就知道 了,新手可能还是需要有图片一步步说明会好些。

看下次谁有时间改代码,以实例的方式把过程截图下来。

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 25, 2012

Contributor

http://v.youku.com/v_show/id_XNDU0MDQxODM2.html ruby-china 的 happypeter 做的视频,正好适合

Contributor

lufeihaidao commented Dec 25, 2012

http://v.youku.com/v_show/id_XNDU0MDQxODM2.html ruby-china 的 happypeter 做的视频,正好适合

@lvjian700

This comment has been minimized.

Show comment
Hide comment
@lvjian700

lvjian700 Dec 25, 2012

@lufeihaidao 的视频很棒! 一看就懂, 准备动手实践一下.

@lufeihaidao 的视频很棒! 一看就懂, 准备动手实践一下.

@doitian

This comment has been minimized.

Show comment
Hide comment
@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 25, 2012

@doitian https://travis-ci.org/ 有没有好的Guide,没用过。

ghost commented Dec 25, 2012

@doitian https://travis-ci.org/ 有没有好的Guide,没用过。

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 25, 2012

Contributor

@doitian
image

请问这是为何?

Contributor

nightire commented Dec 25, 2012

@doitian
image

请问这是为何?

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 25, 2012

Member

@nightire fetch下先

Member

doitian commented Dec 25, 2012

@nightire fetch下先

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 25, 2012

Member

@leonkaiyu .travis.yml 已经配置好了,只需要去 travis 用 github 帐号登录,进帐户管理,把 19wu 设置成 On。点下开关前面的小扳手,会跳到 github hook 设置页面,找到 travis 点下 Test 确定成功后保存就行了。

Member

doitian commented Dec 25, 2012

@leonkaiyu .travis.yml 已经配置好了,只需要去 travis 用 github 帐号登录,进帐户管理,把 19wu 设置成 On。点下开关前面的小扳手,会跳到 github hook 设置页面,找到 travis 点下 Test 确定成功后保存就行了。

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 25, 2012

Contributor

@doitian fetch之后问题依旧,奇怪ing...

@leonkaiyu 我写了一篇简要的说明,你看下先

Contributor

nightire commented Dec 25, 2012

@doitian fetch之后问题依旧,奇怪ing...

@leonkaiyu 我写了一篇简要的说明,你看下先

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 25, 2012

Member

应该是

git branch -u upstream/master
Member

doitian commented Dec 25, 2012

应该是

git branch -u upstream/master
@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

我补充下,如果是Mac用户使用Homebrew安装Postgresql的话,默认的系统用户不是postgres而是你安装的用户名。当然在安装19wu的时候,可以先把database.yml.example修改。再执行 rake setup。

ghost commented Dec 26, 2012

我补充下,如果是Mac用户使用Homebrew安装Postgresql的话,默认的系统用户不是postgres而是你安装的用户名。当然在安装19wu的时候,可以先把database.yml.example修改。再执行 rake setup。

@saberma

This comment has been minimized.

Show comment
Hide comment
@saberma

saberma Dec 26, 2012

Member

能不能修改 setup 脚本,在里面判断如果是 mac,就直接把 database.yml.example 中的用户名修改为安装的用户名(当前用户名?) ,再复制出 database.yml

其他用 mac 的也有这个情况吗?是通过 Homebrew 安装才有的问题?

Member

saberma commented Dec 26, 2012

能不能修改 setup 脚本,在里面判断如果是 mac,就直接把 database.yml.example 中的用户名修改为安装的用户名(当前用户名?) ,再复制出 database.yml

其他用 mac 的也有这个情况吗?是通过 Homebrew 安装才有的问题?

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

在Mac下面是不能切换到sudo - postgres的。在 Linux 下面这样没有问题。

Mac /etc/passwd

_postgres:*:216:216:PostgreSQL Server:/var/empty:/usr/bin/false

Linux /etc/passwd

postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

所以,Homebrew安装后,初始化数据库的指令是没有带 -U 的。我也是第一次用PostgreSQL,之前是颇受曲折。

ghost commented Dec 26, 2012

在Mac下面是不能切换到sudo - postgres的。在 Linux 下面这样没有问题。

Mac /etc/passwd

_postgres:*:216:216:PostgreSQL Server:/var/empty:/usr/bin/false

Linux /etc/passwd

postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

所以,Homebrew安装后,初始化数据库的指令是没有带 -U 的。我也是第一次用PostgreSQL,之前是颇受曲折。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian push -u 和 fetch -u 是什么意思呢?一般不是先 fetch 然后 diff 最后没有问题 merge 。

ghost commented Dec 26, 2012

@doitian push -u 和 fetch -u 是什么意思呢?一般不是先 fetch 然后 diff 最后没有问题 merge 。

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 26, 2012

Member

-u--set-upstream-to 的缩写,意思是把当前 branch 和某个远端的 branch 绑定起来,这样你 push pull 的时候就不用显示指明是哪个远端的 branch 了。另外 -u 默认 --track,在 git status 的时候会显示 xxx commits behind 什么的。

Member

doitian commented Dec 26, 2012

-u--set-upstream-to 的缩写,意思是把当前 branch 和某个远端的 branch 绑定起来,这样你 push pull 的时候就不用显示指明是哪个远端的 branch 了。另外 -u 默认 --track,在 git status 的时候会显示 xxx commits behind 什么的。

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 26, 2012

Contributor

我一直不明白 remote 分为 push 和 fetch 是为什么? fetch 是什么意思?谁能帮忙解释一下?

Contributor

lufeihaidao commented Dec 26, 2012

我一直不明白 remote 分为 push 和 fetch 是为什么? fetch 是什么意思?谁能帮忙解释一下?

@lvjian700

This comment has been minimized.

Show comment
Hide comment
@lvjian700

lvjian700 Dec 26, 2012

@lufeihaidao push是推送改动, fetch 是将服务器版本更新到本地. fetch 跟 pull 有区别. fetch 是只更新不合并. pull 更新+合并

@lufeihaidao push是推送改动, fetch 是将服务器版本更新到本地. fetch 跟 pull 有区别. fetch 是只更新不合并. pull 更新+合并

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

应该是 pull 和 fetch 吧?

fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

pull 目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

ghost commented Dec 26, 2012

应该是 pull 和 fetch 吧?

fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

pull 目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 26, 2012

Contributor

@lvjian700 @leonkaiyu Thanks. 我是查 git remote -v 时看每一个远端都有 push 和 fetch,不太明白,多谢解释,现在明白了

Contributor

lufeihaidao commented Dec 26, 2012

@lvjian700 @leonkaiyu Thanks. 我是查 git remote -v 时看每一个远端都有 push 和 fetch,不太明白,多谢解释,现在明白了

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@lufeihaidao 你看的那个是指远程仓库拉取地址和你提交修改的地址。

ghost commented Dec 26, 2012

@lufeihaidao 你看的那个是指远程仓库拉取地址和你提交修改的地址。

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 26, 2012

Contributor

@doitian fetch 之后执行 git branch -u upstream/master 被告知 error: unknown switch `u' 请问何故? ubuntu1210

Contributor

lufeihaidao commented Dec 26, 2012

@doitian fetch 之后执行 git branch -u upstream/master 被告知 error: unknown switch `u' 请问何故? ubuntu1210

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@lufeihaidao 我本地help里面都没有这个指令。不知道是不是@doitian自己定义的。

ghost commented Dec 26, 2012

@lufeihaidao 我本地help里面都没有这个指令。不知道是不是@doitian自己定义的。

@lufeihaidao

This comment has been minimized.

Show comment
Hide comment
@lufeihaidao

lufeihaidao Dec 26, 2012

Contributor

@leonkaiyu 对啊,我也没有,不知道是不是应该改成这样:git branch -t --set-upstream upstream/master ?
我执行后提示 Branch upstream/master set up to track local branch master. 这样是不是就对了?
@doitian

Contributor

lufeihaidao commented Dec 26, 2012

@leonkaiyu 对啊,我也没有,不知道是不是应该改成这样:git branch -t --set-upstream upstream/master ?
我执行后提示 Branch upstream/master set up to track local branch master. 这样是不是就对了?
@doitian

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

不知道 git branch -b upstream/master 或者 git branch --track upstream/master 有多大的区别?
@doitian “意思是把当前 branch 和某个远端的 branch 绑定起来,这样你 push pull 的时候就不用显示指明是哪个远端的 branch 了” 前面2条好像也是同样的效果。

ghost commented Dec 26, 2012

不知道 git branch -b upstream/master 或者 git branch --track upstream/master 有多大的区别?
@doitian “意思是把当前 branch 和某个远端的 branch 绑定起来,这样你 push pull 的时候就不用显示指明是哪个远端的 branch 了” 前面2条好像也是同样的效果。

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 26, 2012

Member

目测你们 git 版本太老了, 用这个吧

git config branch.master.remote upstream
Member

doitian commented Dec 26, 2012

目测你们 git 版本太老了, 用这个吧

git config branch.master.remote upstream
@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian 原来如此。

git version 1.7.10.2 (Apple Git-33)

ghost commented Dec 26, 2012

@doitian 原来如此。

git version 1.7.10.2 (Apple Git-33)
@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 26, 2012

Member

@lufeihaidao @leonkaiyu

--track --set-upstream 效果一样

Member

doitian commented Dec 26, 2012

@lufeihaidao @leonkaiyu

--track --set-upstream 效果一样

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian 项目是直接push到saberma/19wu,还是放到自己的master上面以后,request pull?

ghost commented Dec 26, 2012

@doitian 项目是直接push到saberma/19wu,还是放到自己的master上面以后,request pull?

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 26, 2012

Member

@leonkaiyu 推荐你建个branch,push上去后发 pull request。自己的 master 始终和 sabmer19wu 的 master 一致。这样一是 pull request 会根据你的 branch 生成标题,就不用自己改了。另外你完成一个小功能 但是还没有被 merge 的时候,你可以从 master 建立新的 branch 去做新的功能,不会互相影响。原来那个功能出现问题你还可以随时切回那个 branch 继续 push 新的 commits。就算没有被 accept,你的这个 branch 也记录了你所有的工作。

Member

doitian commented Dec 26, 2012

@leonkaiyu 推荐你建个branch,push上去后发 pull request。自己的 master 始终和 sabmer19wu 的 master 一致。这样一是 pull request 会根据你的 branch 生成标题,就不用自己改了。另外你完成一个小功能 但是还没有被 merge 的时候,你可以从 master 建立新的 branch 去做新的功能,不会互相影响。原来那个功能出现问题你还可以随时切回那个 branch 继续 push 新的 commits。就算没有被 accept,你的这个 branch 也记录了你所有的工作。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian 谢谢。明白了!我一会重新操作一遍。

ghost commented Dec 26, 2012

@doitian 谢谢。明白了!我一会重新操作一遍。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian 请问一下,如果使用了 git branch -u upstream/master 的话,git pull 和 git push 默认都是 upstream 了吗?

ghost commented Dec 26, 2012

@doitian 请问一下,如果使用了 git branch -u upstream/master 的话,git pull 和 git push 默认都是 upstream 了吗?

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 26, 2012

Member

当前 branch push/pull 都是对应 upstream/master 了。不需要 push,因为是通
过 Pull Request。master 和 upstream/master 同步可以每次都从最新代码上开
始,自己的 master 没多大作用,就留着长草吧。

Member

doitian commented Dec 26, 2012

当前 branch push/pull 都是对应 upstream/master 了。不需要 push,因为是通
过 Pull Request。master 和 upstream/master 同步可以每次都从最新代码上开
始,自己的 master 没多大作用,就留着长草吧。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 26, 2012

@doitian 哈哈~ 我也刚才重新看了 Git Pro 关于贡献代码的章节。提到了我们项目的贡献模式。

我现在的理解。

第一步:从 blessed repository 克隆项目到本地。
git clone git://github.com/saberma/19wu.git

第二步:在本地建立开发分支 feature1
git checkout -b feature/1-some

第三步:当完成工作以后,将工作 Commit 修改到本地库,回到 Github 的 saberma/19wu 项目进行 Fork 操作。
vim xxxx.rb
git add .
git commit -m "xxxx"

第四步:添加 Fork 库(也就是个人公开库)的地址到本地库的 git remote 里面。
git remote add my19wu url

第五步:获取最新的 saberma/master 数据当本地的 master 分支
git pull

第六步:将 master 库 rebase 到 feature1 分支,完成合并。
git checkout feature/1-some
git rebase origin/master

第七步:将 feature1 分支推送到自己的公开库里
git push my19wu feature/1-some

最后,回到 Github 给 saberma/19wu 进行 pull request 操作。等待管理员接受合并。这个时候,可以去接其他的issue。

接到新的 issue 以后,按照先创建 issue 分支,然后开发,再把 issue 分支提交到自己的公开仓库。Pull request 操作。

PS:我自己公开库的 mater 就如你说,长草吧!

以上是我自己总结。不知道有没有问题?

ghost commented Dec 26, 2012

@doitian 哈哈~ 我也刚才重新看了 Git Pro 关于贡献代码的章节。提到了我们项目的贡献模式。

我现在的理解。

第一步:从 blessed repository 克隆项目到本地。
git clone git://github.com/saberma/19wu.git

第二步:在本地建立开发分支 feature1
git checkout -b feature/1-some

第三步:当完成工作以后,将工作 Commit 修改到本地库,回到 Github 的 saberma/19wu 项目进行 Fork 操作。
vim xxxx.rb
git add .
git commit -m "xxxx"

第四步:添加 Fork 库(也就是个人公开库)的地址到本地库的 git remote 里面。
git remote add my19wu url

第五步:获取最新的 saberma/master 数据当本地的 master 分支
git pull

第六步:将 master 库 rebase 到 feature1 分支,完成合并。
git checkout feature/1-some
git rebase origin/master

第七步:将 feature1 分支推送到自己的公开库里
git push my19wu feature/1-some

最后,回到 Github 给 saberma/19wu 进行 pull request 操作。等待管理员接受合并。这个时候,可以去接其他的issue。

接到新的 issue 以后,按照先创建 issue 分支,然后开发,再把 issue 分支提交到自己的公开仓库。Pull request 操作。

PS:我自己公开库的 mater 就如你说,长草吧!

以上是我自己总结。不知道有没有问题?

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 26, 2012

Contributor

@leonkaiyu 不太对劲

应该是先fork saberma/19wu,变成YOU/19wu;然后clone YOU/19wu到本地,并且设定upstream / track之。

此后每当开始工作前,先更新本地master保持和upstream同步,然后new branch干活;完事儿后push 到 origin(也就是 YOU/19wu),接着PR。

以此循环即可。

Contributor

nightire commented Dec 26, 2012

@leonkaiyu 不太对劲

应该是先fork saberma/19wu,变成YOU/19wu;然后clone YOU/19wu到本地,并且设定upstream / track之。

此后每当开始工作前,先更新本地master保持和upstream同步,然后new branch干活;完事儿后push 到 origin(也就是 YOU/19wu),接着PR。

以此循环即可。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 27, 2012

@nightire 我是看见既然需要设置 git branch -u upstream/master 还不如直接 origin 是中心仓库。我自己的工作区单独添加进去。这个思路是我从 Git Pro 一书的 http://git-scm.com/book/zh/分布式-Git-为项目作贡献#公开的小型项目 看见的。

ghost commented Dec 27, 2012

@nightire 我是看见既然需要设置 git branch -u upstream/master 还不如直接 origin 是中心仓库。我自己的工作区单独添加进去。这个思路是我从 Git Pro 一书的 http://git-scm.com/book/zh/分布式-Git-为项目作贡献#公开的小型项目 看见的。

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 27, 2012

Contributor

@leonkaiyu 这书没看过,待我看看再说。不过我之所以回复你不是因为认为你错了,而是因为你说的和wiki里说的不同,我怕很多入门者看到以后会糊涂。Git的难点就在于理解它的工作方式,实际上完成同一种任务可能会有很多不同的方式,只不过对于初学者来说就怕选择太多,会导致出错并且难以理解。所以,如果你要实践一种不同的思路,应该特地指出和wiki里方式的差异,这样才不会对别人造成困扰吧。

Contributor

nightire commented Dec 27, 2012

@leonkaiyu 这书没看过,待我看看再说。不过我之所以回复你不是因为认为你错了,而是因为你说的和wiki里说的不同,我怕很多入门者看到以后会糊涂。Git的难点就在于理解它的工作方式,实际上完成同一种任务可能会有很多不同的方式,只不过对于初学者来说就怕选择太多,会导致出错并且难以理解。所以,如果你要实践一种不同的思路,应该特地指出和wiki里方式的差异,这样才不会对别人造成困扰吧。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 27, 2012

@nightire 我也是第一次参与开源项目,只是不明白Wiki中的步骤为何,所以想搞清楚点。提出来大家交流~ Wiki的方式没有问题哈。我第一遍就是按照那个方式做的,只是当时因为设置那个 --set-upstream 让我不是很理解。

ghost commented Dec 27, 2012

@nightire 我也是第一次参与开源项目,只是不明白Wiki中的步骤为何,所以想搞清楚点。提出来大家交流~ Wiki的方式没有问题哈。我第一遍就是按照那个方式做的,只是当时因为设置那个 --set-upstream 让我不是很理解。

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 27, 2012

Contributor

@leonkaiyu 我明白你的困惑,事实上我一开始也很困惑 😕 ……按照Github的帮助文档,当你git remote add upstream https://github.com/saberma/19wu之后,应该是没有必要再去--set-upstream的。事实上,我自己也没有做这一步,目前为止都工作正常。

另外,我看了你之前提到的那本书,个人觉得最大的差异就是那本书里并不是以Github作为中心的,所以我觉得还是以upstream/master作为中心代码仓库比较符合我们的工作模式。Anyway,不过哪一种方式,只要你PR正确,Commit清楚,那就没什么大问题,毕竟我们没有直接向主干提交的权限,有几位管理者控制着,应当不会出大问题。

Contributor

nightire commented Dec 27, 2012

@leonkaiyu 我明白你的困惑,事实上我一开始也很困惑 😕 ……按照Github的帮助文档,当你git remote add upstream https://github.com/saberma/19wu之后,应该是没有必要再去--set-upstream的。事实上,我自己也没有做这一步,目前为止都工作正常。

另外,我看了你之前提到的那本书,个人觉得最大的差异就是那本书里并不是以Github作为中心的,所以我觉得还是以upstream/master作为中心代码仓库比较符合我们的工作模式。Anyway,不过哪一种方式,只要你PR正确,Commit清楚,那就没什么大问题,毕竟我们没有直接向主干提交的权限,有几位管理者控制着,应当不会出大问题。

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 27, 2012

Member

--set-upstream 不是必要的,只是方便点。随时可以切回 master 查看 upstream/master 的状态,新的 branch 也可以在 master pull 之后基于 master 创建。如果不设置,也可以直接 fetch

# 拉取 upstream 的数据
git fetch upstream
# 基于 saberma/19wu master branch 创建新的 branch
git checkout -b feature/41-how-to-contribute upstream/master
# 新的 branch push 到自己的 repo 中并绑定起来
git push -u origin feature/41-how-to-contribute
Member

doitian commented Dec 27, 2012

--set-upstream 不是必要的,只是方便点。随时可以切回 master 查看 upstream/master 的状态,新的 branch 也可以在 master pull 之后基于 master 创建。如果不设置,也可以直接 fetch

# 拉取 upstream 的数据
git fetch upstream
# 基于 saberma/19wu master branch 创建新的 branch
git checkout -b feature/41-how-to-contribute upstream/master
# 新的 branch push 到自己的 repo 中并绑定起来
git push -u origin feature/41-how-to-contribute
@VaughnLi

This comment has been minimized.

Show comment
Hide comment
@VaughnLi

VaughnLi Dec 27, 2012

呼叫@doitian 请教下.
"把 saberma 的 repo 加为 remote, 并且 master 跟踪 saberma 的 master 分支"

git fetch upstream
git branch -u upstream/master
# 如果提示没有 -u,是因为 git 版本比较低,用下面这个代替
# git branch -t --set-upstream upstream/master
git pull

我记得昨天在家操作的时候, git branch -u upstream/master 在我的本地生成了upstream/master的分支(而master分支应该是执行git fetch upstream生成的) . 而上述命令中git pull 应该是将upstream拉到本地的upstream/master分支,好像是使用upstream/master 来跟踪saberma 的 master(不知道是不是我理解有问题呀).

呼叫@doitian 请教下.
"把 saberma 的 repo 加为 remote, 并且 master 跟踪 saberma 的 master 分支"

git fetch upstream
git branch -u upstream/master
# 如果提示没有 -u,是因为 git 版本比较低,用下面这个代替
# git branch -t --set-upstream upstream/master
git pull

我记得昨天在家操作的时候, git branch -u upstream/master 在我的本地生成了upstream/master的分支(而master分支应该是执行git fetch upstream生成的) . 而上述命令中git pull 应该是将upstream拉到本地的upstream/master分支,好像是使用upstream/master 来跟踪saberma 的 master(不知道是不是我理解有问题呀).

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 27, 2012

Member

@Hyperxnoia git branch -u 不会创建新的 branch,只会改变你的 .git/config 中的设置,影响 git pull/push 操作的行为。upstream/master 这些实际是 remotes/upstream/master 的简写,是在你 git fetch 的时候存放到 .git/refs 下的,他们相当于会自己移动的指针,告诉你 upstream 各个 branch 现在在代码树中的位置。

git pull 在没有指定参数的情况下,会先 fetch 你所在 branch 对应的 remote,然后把这个 remote 中相应的 branch merge 进当前 branch。以你贴出的命令为例

# upstream 的更改同步到本地,更新 refs/remotes/upstream 下的文件
git fetch upstream
# 本地 master 对应 upstream/master
git branch -u upstream/master
# 再 fetch 一次 upstream,并把 upstream/master merge 进来
git pull
Member

doitian commented Dec 27, 2012

@Hyperxnoia git branch -u 不会创建新的 branch,只会改变你的 .git/config 中的设置,影响 git pull/push 操作的行为。upstream/master 这些实际是 remotes/upstream/master 的简写,是在你 git fetch 的时候存放到 .git/refs 下的,他们相当于会自己移动的指针,告诉你 upstream 各个 branch 现在在代码树中的位置。

git pull 在没有指定参数的情况下,会先 fetch 你所在 branch 对应的 remote,然后把这个 remote 中相应的 branch merge 进当前 branch。以你贴出的命令为例

# upstream 的更改同步到本地,更新 refs/remotes/upstream 下的文件
git fetch upstream
# 本地 master 对应 upstream/master
git branch -u upstream/master
# 再 fetch 一次 upstream,并把 upstream/master merge 进来
git pull
@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 27, 2012

Contributor

@Hyperxnoia 呵呵,我前面说的困惑是因为发生了和你一样的问题,在执行了相关命令后,莫名其妙创建了一个upstream/master分支,所以我也在思考到底是我的master在sync,还是upstream/master在sync。

我不知道为什么会出现这种状况,我用的是最新版的Git,环境是OS X Mountain Lion。Google research了之后知道的确是不应该出现一个upstream/master分支的。

为了搞清楚不是我弄错了,我重新做了一遍:fork -> clone -> remote add upstream,然后我查看了Git的本地设置,如下:

$ git config --list --local

# 以下是相关的输出内容

remote.origin.url=git@github.com:nightire/19wu.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin    # master sync to origin (Forked Repo)
branch.master.merge=refs/heads/master
remote.upstream.url=git://github.com/saberma/19wu.git           
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/* 

接下来:

$ git branch -u upstream/master

# 以下是相关的输出内容,请注意第三行!

remote.origin.url=git@github.com:nightire/19wu.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=upstream    # master sync to upstream (Main Repo)
branch.master.merge=refs/heads/master
remote.upstream.url=git://github.com/saberma/19wu.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*

就是这样。所以,如果我没搞错的话,以后去做同步的时候,只需要:

$ git pull

就可以,而不需要

$ git pull upstream

这就好比当你

$ git push -u origin master

之后,你就不需要再指定 push target 了,只需要

$ git push

即可。

@doitian 我的理解正确吗?

Contributor

nightire commented Dec 27, 2012

@Hyperxnoia 呵呵,我前面说的困惑是因为发生了和你一样的问题,在执行了相关命令后,莫名其妙创建了一个upstream/master分支,所以我也在思考到底是我的master在sync,还是upstream/master在sync。

我不知道为什么会出现这种状况,我用的是最新版的Git,环境是OS X Mountain Lion。Google research了之后知道的确是不应该出现一个upstream/master分支的。

为了搞清楚不是我弄错了,我重新做了一遍:fork -> clone -> remote add upstream,然后我查看了Git的本地设置,如下:

$ git config --list --local

# 以下是相关的输出内容

remote.origin.url=git@github.com:nightire/19wu.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin    # master sync to origin (Forked Repo)
branch.master.merge=refs/heads/master
remote.upstream.url=git://github.com/saberma/19wu.git           
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/* 

接下来:

$ git branch -u upstream/master

# 以下是相关的输出内容,请注意第三行!

remote.origin.url=git@github.com:nightire/19wu.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=upstream    # master sync to upstream (Main Repo)
branch.master.merge=refs/heads/master
remote.upstream.url=git://github.com/saberma/19wu.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*

就是这样。所以,如果我没搞错的话,以后去做同步的时候,只需要:

$ git pull

就可以,而不需要

$ git pull upstream

这就好比当你

$ git push -u origin master

之后,你就不需要再指定 push target 了,只需要

$ git push

即可。

@doitian 我的理解正确吗?

@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 27, 2012

Member

很正确

Member

doitian commented Dec 27, 2012

很正确

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 27, 2012

Contributor

@leonkaiyu

不,不是这样的。因为我们本地的代码都是clone自己fork的那一份,所以我们永远也不会直接pushupstream去。事实上,除了几个管理者以外,其他人根本就没有pushupstream的权限。这样就不会出现因为失误而影响主干分支的情况发生了。

同时,我们将本地的master分支的remote指定到了upstream,所以当你在本地master分支$ git pull的时候,就可以把主干分支里最新的提交合并到本地master来。这样你就可以获得最新版本的主干代码。

在此基础上,你在本地建立其他的分支,开始自己的开发工作。当工作完成后,你可以有多种选择,举两个为例:

  1. 你可以把其他分支merge到本地master,然后pushorigin/master(注意:不是upstream/master,你没有权限的)。最后PR,等待主干那边做合并。这个方式可行,但是不推荐,因为一旦你的PR被reject,下次你去pull upstream的时候,必然会产生冲突,你需要去做合并来修正自己的本地master
  2. 你可以直接push分支到origin下的新分支,然后再PR。这是推荐的方式,因为你的PR无论是否被accept,都不会影响本地master去同步主干上的最新代码。如果被接受了,那么下次你同步的时候,自然就会把你的新代码合并到本地master来(因为upstream/master已经接受了你的PR);如果PR被拒,至少你也可以留下一份分支记录。

最后,-u参数的意义就在于帮你记住你的操作的目标,这样你就可以不用每次都手动指定了,比如:

# 假设我在本地 master 分支下

$ git branch -u upstream/master    # 将我的 master 分支指向 upstream/master
$ git pull / fetch                            # 于是我无须指定来源

$ git push                                    # 我没有权限向 upstream/master 写入,所以不会生效

$ git push origin master                # 这个当然可以!
$ git push -u origin master            # 这个也可以,不过会有 push.default is unset 的提示,你可以加上这一条在 config 里

# 假设之后我要开发新功能,来到 new-feature 分支下

$ git push                                    # 报出提示,没有指定 push target
$ git push origin new-feature          # 成功,在 origin 建立了同名分支。可以去 Pull Request 了

$ git push -u origin new-feature      # 同上。不过这一次,Git 将记住你在该分支下的目标
$ git push                                    # 这一次,不用再输入 origin new-feature 了。
Contributor

nightire commented Dec 27, 2012

@leonkaiyu

不,不是这样的。因为我们本地的代码都是clone自己fork的那一份,所以我们永远也不会直接pushupstream去。事实上,除了几个管理者以外,其他人根本就没有pushupstream的权限。这样就不会出现因为失误而影响主干分支的情况发生了。

同时,我们将本地的master分支的remote指定到了upstream,所以当你在本地master分支$ git pull的时候,就可以把主干分支里最新的提交合并到本地master来。这样你就可以获得最新版本的主干代码。

在此基础上,你在本地建立其他的分支,开始自己的开发工作。当工作完成后,你可以有多种选择,举两个为例:

  1. 你可以把其他分支merge到本地master,然后pushorigin/master(注意:不是upstream/master,你没有权限的)。最后PR,等待主干那边做合并。这个方式可行,但是不推荐,因为一旦你的PR被reject,下次你去pull upstream的时候,必然会产生冲突,你需要去做合并来修正自己的本地master
  2. 你可以直接push分支到origin下的新分支,然后再PR。这是推荐的方式,因为你的PR无论是否被accept,都不会影响本地master去同步主干上的最新代码。如果被接受了,那么下次你同步的时候,自然就会把你的新代码合并到本地master来(因为upstream/master已经接受了你的PR);如果PR被拒,至少你也可以留下一份分支记录。

最后,-u参数的意义就在于帮你记住你的操作的目标,这样你就可以不用每次都手动指定了,比如:

# 假设我在本地 master 分支下

$ git branch -u upstream/master    # 将我的 master 分支指向 upstream/master
$ git pull / fetch                            # 于是我无须指定来源

$ git push                                    # 我没有权限向 upstream/master 写入,所以不会生效

$ git push origin master                # 这个当然可以!
$ git push -u origin master            # 这个也可以,不过会有 push.default is unset 的提示,你可以加上这一条在 config 里

# 假设之后我要开发新功能,来到 new-feature 分支下

$ git push                                    # 报出提示,没有指定 push target
$ git push origin new-feature          # 成功,在 origin 建立了同名分支。可以去 Pull Request 了

$ git push -u origin new-feature      # 同上。不过这一次,Git 将记住你在该分支下的目标
$ git push                                    # 这一次,不用再输入 origin new-feature 了。
@doitian

This comment has been minimized.

Show comment
Hide comment
@doitian

doitian Dec 27, 2012

Member

@leonkaiyu 那个 git push 是指在你的 topic branch 里。Pull request 之前,
你可以检查下 master,如果提交比较多的话,你可以先 merge 下,以防维护者
需要手动 merge 解决 conflict

第一种方案,切回 master 查看

git checkout master
git pull
git log

然后切回去

git checkout feature/41-how-to-contribute
git merge --no-ff master

另一种,直接 fetch,省得切来切去的

git fetch upstream
git log upstream/master
git merge --no-ff upstream/master

如果你 git 掌握的不错,为了让树结构更好看,是可以通过 rebase 来操作的,不
过对于已经 push 到自己 repo 的 branch 需要 push --force (force 须谨慎,
确保这个分支没有其它人在用)。有兴趣可以自己查看 rebase 和 push --force 的文档。

Member

doitian commented Dec 27, 2012

@leonkaiyu 那个 git push 是指在你的 topic branch 里。Pull request 之前,
你可以检查下 master,如果提交比较多的话,你可以先 merge 下,以防维护者
需要手动 merge 解决 conflict

第一种方案,切回 master 查看

git checkout master
git pull
git log

然后切回去

git checkout feature/41-how-to-contribute
git merge --no-ff master

另一种,直接 fetch,省得切来切去的

git fetch upstream
git log upstream/master
git merge --no-ff upstream/master

如果你 git 掌握的不错,为了让树结构更好看,是可以通过 rebase 来操作的,不
过对于已经 push 到自己 repo 的 branch 需要 push --force (force 须谨慎,
确保这个分支没有其它人在用)。有兴趣可以自己查看 rebase 和 push --force 的文档。

@ghost

This comment has been minimized.

Show comment
Hide comment
@ghost

ghost Dec 27, 2012

非常感谢 @doitian @nightire 。清楚了。等机会亲自操作一下。

ghost commented Dec 27, 2012

非常感谢 @doitian @nightire 。清楚了。等机会亲自操作一下。

@VaughnLi

This comment has been minimized.

Show comment
Hide comment
@VaughnLi

VaughnLi Dec 27, 2012

@doitian @nightire 我好像明白了,多谢各位。

@doitian @nightire 我好像明白了,多谢各位。

@hardywu

This comment has been minimized.

Show comment
Hide comment
@hardywu

hardywu Dec 27, 2012

Contributor

我在branch issue/signin

 git rebase master 

顯示

 Current branch issue/signin is up to date.

checkout 回master,沒任何變化。

這是怎麼回事啊?

Contributor

hardywu commented Dec 27, 2012

我在branch issue/signin

 git rebase master 

顯示

 Current branch issue/signin is up to date.

checkout 回master,沒任何變化。

這是怎麼回事啊?

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Dec 27, 2012

Contributor

@hardywu 你这个操作的结果是把master分支下的最新变更(在你建立issue/signin之后的变动)合并到了issue/signin分支。

如果master之下没有任何变更,当然就不会有任何变化,正如同你看到的提示:Current branch issue/signin is up to date.正说明了这一点。

如果你是为了要在提交issue/signin之前,把主干分支上的最新代码合并进来,那么你应该:

$ git checkout master

$ git pull upstream    # 这一步是为了把upstream上的最新代码合并入本地的master

$ git checkout 'issue/signin'

$ git rebase master    # 如果第二步有新代码被取回,那么这一步才有用;如果第二步啥都没有,那说明你已经在最新的代码上了
Contributor

nightire commented Dec 27, 2012

@hardywu 你这个操作的结果是把master分支下的最新变更(在你建立issue/signin之后的变动)合并到了issue/signin分支。

如果master之下没有任何变更,当然就不会有任何变化,正如同你看到的提示:Current branch issue/signin is up to date.正说明了这一点。

如果你是为了要在提交issue/signin之前,把主干分支上的最新代码合并进来,那么你应该:

$ git checkout master

$ git pull upstream    # 这一步是为了把upstream上的最新代码合并入本地的master

$ git checkout 'issue/signin'

$ git rebase master    # 如果第二步有新代码被取回,那么这一步才有用;如果第二步啥都没有,那说明你已经在最新的代码上了
@JellyBool

This comment has been minimized.

Show comment
Hide comment
@JellyBool

JellyBool Nov 25, 2015

真心感谢 @nightire @saberma 今天仔细看了,也很庆幸有了自己的第一个PR。多说两句就是,很敬佩 @nightire 这位,不管是在github,还是SF,在你身上学到的东西太多了,不管是编程的相关知识还是对待编程的态度,非常感谢

真心感谢 @nightire @saberma 今天仔细看了,也很庆幸有了自己的第一个PR。多说两句就是,很敬佩 @nightire 这位,不管是在github,还是SF,在你身上学到的东西太多了,不管是编程的相关知识还是对待编程的态度,非常感谢

@nightire

This comment has been minimized.

Show comment
Hide comment
@nightire

nightire Nov 25, 2015

Contributor

@JellyBool 谢谢你的肯定,这么晚还没睡啊,这么老的 Issue 也被你翻出来了呀……原来我 2012 年就知道善用 rebase 了,忽然佩服了一下自己 😄

早点睡,晚安!

Contributor

nightire commented Nov 25, 2015

@JellyBool 谢谢你的肯定,这么晚还没睡啊,这么老的 Issue 也被你翻出来了呀……原来我 2012 年就知道善用 rebase 了,忽然佩服了一下自己 😄

早点睡,晚安!

@JellyBool

This comment has been minimized.

Show comment
Hide comment
@JellyBool

JellyBool Nov 26, 2015

哈哈哈,发完就睡了。希望某一天,也能成为像你那样的人。yoshi @nightire

哈哈哈,发完就睡了。希望某一天,也能成为像你那样的人。yoshi @nightire

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment