1 快速开始
简单理解
git - 代码版本管理控制,帮助管理代码辅助团队协作开发。
github - 部署了git分布式开源版本控制系统的项目托管平台。讲很多功能可视化,方便操作。
辅助软件:
github官方图形界面软件 - 想减少一些配置的麻烦时使用
git bash - git官方命令行界面 - 本教程命令使用的环境
sourceTree - 三方git图形管理平台
三者用任意一个都可以完成需要的工作。
注册github账号,根据提示可以建立自己的第一个项目。
可以通过官方的git try体验一下整个过程,一些具体的内容见后。
git try - https://try.github.io
下面分三个层次来说明一下我们会用到的git的运作:
1.在本地的库的操作
2.本地库和github远程库的操作
3.多人协作
2 本地库操作 - 关于git的几步提交
这里假设在计算机本地已经git init或者git clone了一个库。
- 我们修改或者增加了一些文件
- 查看变动
$ git status
可以查看那些文件是新增的,修改的
比如上图untracked状态 - 新增文件,modified - 修改过的文件 - 本地暂存stage
$ git add .
#添加所有变动
$ git add [file]
#添加某个文件 - 将暂存的改变作为一个新的版本
$ git commit -m "update"
#-m参数后面是提交备注,必写
这时就会在本地创建一个新的版本。 - 版本回退
有时候自己想退回之前的某个版本
$ git log
#可以查看自己的每次commit记录,找到需要退回的commit的编号
$ git reset 2e3e12d2e3ea1f226c6d12bd99231bb3d0ce35ee [file]
利用commit号将本地文件退回某个节点,file可以不写,就是将整个库都退回那个版本。
3 本地库和远程git库操作
如果本地库是git init
产生,那么github远端还没有自己的库。需要进行配置
- 现在github建立一个库,并获得地址[address]
- 利用
git remote add origin [adress]
来配置远程库地址 - 将修改完的内容通过
$ git push origin mater
来将本地内容推送到远程origin库的master分枝
Tip:如果下次想用简化命令git push直接push,需要在首次使用完整命令的时候
$ git push -u origin mater
#来让系统记着自己的push选项。
如果本地库是从自己的git clone下来的,那么在自己的本地commit完后,远程的服务器还没更新,那么可以向远程数据库发送自己的更新。
$ git push
$ git push origin master
#完整命令,向远程origin库的master分枝提交代码
如果出现无法提交或者其他错误可以按照提示查一下。
一般有可能是本地的git config配置不对。
# 查看当前所有配置
$ git config -l
# 查看repo配置,响应有--global(用户) --system(系统)
$ git config --local -l
# 设置repo用户名和邮箱
$ git config --local user.name "git_user_name"
$ git config --local user.email "git_registered_email"
4 多人协作
多人协作的时候不但有自己本地库和自己github的远程库还有合作者的远程库。
比如A建立了一个RepoA,B将其Fork有了RepoB,然后git clone到本地RepoB_local。这里就涉及三个库。
情况很多先介绍一些常用的
情形1:开始自己的版本RepoB和RepoA一致,然后再RepoB_local修改了文件,并且做了git push更新了RepoB。此时想让RepoA也接受自己的更新。
方法:需要通过建立一个pull request请求,来让A知道,当A知道后会处理这个请求。如果处理成功,RepoA会更新。这个可以在github的网站页面完成。
情形2:RepoA有了更新,自己需要更新本地RepoB_local和自己云端的RepoB。
方法:一般情况下,自己本地和自己的远程库连通后没有配置上游库(这里是RepoA)信息。
首先添加一个远程库配置:
$ git remote add upstream https://bitbucket.org/maintainer/repo
更多详细可以参考教程 https://github.com/oldratlee/translations/blob/master/git-workflows-and-tutorials/workflow-forking.md
然后就可以从远程库拉取最新的内容
$ git pull upstream master
这时自己的文件会被修改增加,如果有冲突的内容,现在我理解需要手动去从查看并修改文件。最后自己都处理完之后,用git add 和 commit来更新本地库。
获取最新远端代码
$ git pull [repo] [branch]
如果只用$ git pull
,则默认当前的repo和分支。pull下来的分支会与本地进行合并,冲突需要处理。如:
A---B---C origin/master
/ \
D---E---F---G---H master
# 如果本地开发到G,远端为C,则生成H
# fig from:https://blog.youkuaiyun.com/chaiyu2002/article/details/82120256
本地分支开发向远端提交merge - pitch
本地获取最新代码后git checkout -b pitch_1
创建名为pitch_1的分支,并进行切换,相当于git branch pitch_1
+ git checkout pitch_1
命令。在pitch_1中修改。git add .
并git commit -m "fix xxx"
提交。将分支*pitch_1 *git push
到远端。如果远端没有分支,需要在远端创建git push --set-upstream origin pitch_1
。在网页发起merge request
分支管理
git branch -a
查看所有分支,包括远端。本地和远端分支可以视为两个分支。远端分支不一定都在本地。
删除本地不需要的分支:git brach -d branch_name
.
删除远端不需要的分支:git push origin -d branch_name
.
5 问题探讨
Q1: 我们4个组员有申请request的权力,只有你组长才有合并的权力。是吧?
A1: 这个看具体任务和开发模式, 你可以merge给别的组员,再由他merge给我。这个其实比较灵活。不过一般会有一个地方保持一个全组最新的latest version。
Q2: 下一个问题是,当组长同意了其它的合并之后,我本人的cs50平台会自动更新代码吗?还是说,我每次打开cs50平台都要输入命令获取更新的代码?
A2: 代码的更新都需要命令操作,无论云端还是本地的repo更新了都不会影响别的位置的代码直接变化。你如果知道别人有改进,或者自己的工作需要在最新的版本上开始做那么就需要先pull一下对应的源的最新的版本。如果之前的工作没做完,想继续,那就不用每次pull更新啊。
Q3: 关于pull request
A3: pull request顾名思义是你想让别人接受你的东西的时候用,你发一个pull request让我来做pull。我做pull之后就会选择性的merge你的内容。merge完成之后就会形成一个新的版本。如果第三个人想从这个最新的版本开始开发,那么就需要先做一下pull,将这个最新版本拉到本地来,开发完之后再选择update到自己的git还是发一个pull request。
6 其他教程
廖雪峰
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/