Github有本地仓库以及远程仓库之分。
在本地计算机上执行的git add, commit这些操作都是针对本地的仓库进行处理
通过git remote add origin https://github.com/username/Hello-World.git将本地的仓库与远程仓库建立起连接
或者直接git clone URL一个git项目
使用git push origin master将本地的更改以patch形式上传到远程仓库。
抓取更新数据并合并到本地文件
git fetch upstream
# Fetches any new changes from the original repository
git merge upstream/master
# Merges any changes fetched into your working files
git pull upstream master
# Pulls commits from 'upstream' and stores them in the local repository
通过git branch(新建分支) & git checkout(切换HEAD当前分支) & git merge来进行分支管理
自动补全
如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:
source ~/.git-completion.bash
也可以为系统上所有用户都设置默认使用此脚本。Mac 上将此脚本复制到 /opt/local/etc/bash_completion.d 目录中,Linux 上则复制到 /etc/bash_completion.d/ 目录中。这两处目录中的脚本,都会在 Bash 启动时自动加载。
将 HEAD 想象为当前分支的别名
因为每次提交时都记录了祖先信息(译注:即 parent 对象),将来要合并分支时,寻找恰当的合并基础(译注:即共同祖先)的工作其实已经自然而然地摆在那里了,所以实现起来非常容易。Git 鼓励开发者频繁使用分支,正是因为有着这些特性作保障。
git checkout -b [branchname]=
git branch [branchname]
git checkout [branchname]
如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。
git merge [branchname] 将branchname合并到当前分支
git status,合并时出现冲突的文件,将以unmerged状态列出
标准的冲突解决标记
<<<<<<<<<<
========
>>>>>>>>>>
git mergetoll
git branch -merged
git branch --no-merged
一般的分支都是在本地进行
original/master指针与master指针的区别
git fetch origin 来同步远程服务器上的数据到本地,从服务器上抓取更新之后,会在本地产生一个[服务器]/[分支名]的远程分支,必须通过git merge [远程分支]之后才能在本地进行操作,或者执行git checkout -b [分支名] [远程名]/[分支名],一次性创建分支。
创建一个teamone/master的远程分支
git remote add teamone git://git.team1.ourcompany.com
git fetch teamone
推送分支
git push [远程仓库名] [原分支名]:[新分支名]
远程分支无法在本地移动,推送之后才会动作
删除分支
git push [远程名] :[分支名]
衍合
rebase,将当前分支的改变应用于其他分支,使得其他分支变为当前分支的直接下游
原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以基底分支(也就是主干分支 master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 experiment 的提交历史,使它成为 master 分支的直接下游。
最后整合得到的结果没有任何区别,但衍合能产生一个更为整洁的提交历史。衍合是按照每行的修改次序重演一遍修改,而合并是把最终结果合在一起。
实际上是把解决分支补丁同最新主干代码之间冲突的责任,化转为由提交补丁的人来解决。