git操做的学习
HEAD、master、branch总结
- HEAD 是指向当前 commit 的引用,它具备惟一性,每一个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit 。
- branch 是一类引用。HEAD 除了直接指向 commit,也能够经过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时, commit 发生时,HEAD 会带着它所指向的 branch 一块儿移动。
-
master 是 Git 中的默认 branch,它和其它 branch 的区别在于:git
- 新建的仓库中的第一个 commit 会被 master 自动指向;
- 在 git clone 时,会自动 checkout 出 master。
- 可使用git log这个指令查看当前上述三个的指向。
Git 的最基本的工做模型
简单说明
- 从 GitHub 把中央仓库 clone 到本地(使用命令: git clone)
-
把写完的代码提交(先用 git add 文件名 把文件添加到暂存区,再用 git commit交)算法
- 在这个过程当中,可使用 git status 来随时查看工做目录的状态
- 每一个文件有 "changed / unstaged"(已修改), "staged"(已修改并暂存), "commited"(已提交) 三种状态,以及一种特殊状态"untracked"(未跟踪)
- 提交一次或屡次以后,把本地提交 push 到中央仓库(git push)
基本操做
- git clone '仓库地址'
- git add 文件名
- git commit -m '介绍说明'
- git push -u origin branch_name
多人合做的基本工做模型
简单说明
- 多人从Github吧中央仓库clone到本身机器(本地)上(使用命令: git clone)
- 同事 commit 代码到他的本地,并 push 到 GitHub 中央仓库
-
你也能够把本身的 commit 代码到他的本地,并 push 到 GitHub 中央仓库并发
- 若是你的同事比你先push到GitHub中央仓库,也就是说GitHub中央仓库有你本地仓库没有的commits,此时你须要先pull把远端仓库上的新内容取回到本地和本地合并,而后再把合并后的本地仓库向远端仓库推送
- 若是 push 失败,就用 pull 把本地仓库的提交和中央仓库的提交进行合并,而后再 push 一次
基本操做
-
同事一:学习
同事二:code
...开发
-
同事一:it
- git add 文件名
- git commit -m '介绍说明'
- git push -u origin branch_name
-
本身:ast
- git pull origin branch_name
- git add 文件名
- git commit -m '介绍说明'
- git push -u origin branch_name
合并commits
主要用到的操做是merge引用
- merge含义:指定一个 commit,把它合并到当前的 commit 来。
-
使用场景:总结
- HEAD 领先于目标 commit:
若是 merge 时的目标 commit 和 HEAD 处的 commit 并不存在分叉,而是 HEAD 领先于目标 commit,那么 merge 就不必再建立一个新的 commit 来进行合并操做,由于并无什么须要合并的。在这种状况下, Git 什么也不会作,merge 是一个空操做。
- HEAD 落后于 目标 commit——fast-forward:
若是 HEAD 和目标 commit 依然是不存在分叉,但 HEAD 不是领先于目标 commit,而是落后于目标 commit,Git 会直接把 HEAD(以及它所指向的 branch,若是有的话)移动到目标 commit:git merge feature1
- HEAD 与目标 commit(branch1)存在分叉:
从目标 commit 和当前 commit (即 HEAD 所指向的 commit)分叉的位置起,把目标 commit 的路径上的全部 commit 的内容一并应用到当前 commit,而后自动生成一个新的 commit。git merge branch1
常见问题
-
push冲突
- 场景描述:在团队开发过程当中,多人并发工做,你的同事有可能先你push本身的commit到Github中央仓库,致使中央仓库获得了更新,这样使得中央仓库包含了本身本地仓库没有的内容,这时候你再push,push会被拒绝。
- 解决方案:
先用 pull 把远端仓库上的新内容取回到本地和本地合并,而后再把合并后的本地仓库向远端仓库推送。
-
基本操做:
- git pull origin branch_name
- git add 文件名
- git commit -m '内容说明'
- git push -u origin branch_name
-
merge冲突
- 场景描述:merge 在作合并的时候,是有必定的自动合并能力的:若是一个分支改了 A 文件,另外一个分支改了 B 文件,那么合并后就是既改 A 也改 B,这个动做会自动完成;若是两个分支都改了同一个文件,但一个改的是第 1 行,另外一个改的是第 2 行,那么合并后就是第 1 行和第 2 行都改,也是自动完成。可是,若是两个分支修改了同一部份内容,merge 的自动算法就搞不定了。这种状况 Git 称之为:冲突。
-
解决方案:
1. 解决掉冲突:当使用了git merge branch1时,git会把两个文件冲突的内容放在一块儿,并使用相关符号区分开来,而后须要的自行判断咱们选择保留哪一个分支上的修改或者再次自行修改内容,保存文件。
2. 手动提交,按照正常的提交操做提交。
-
基本操做:
1. git merge branch1
2. 修改冲突文件内容,保存文件
3. git add 文件名
4. git commit -m '内容说明'
5. git push -u origin branch_name
基本指令
- git log 查看历史提交记录 键盘英文状态下按字母q,退出git log
- git status 随时查看工做目录的状态
- git clone '地址' 下拉到本地
- git add 文件名 把文件添加到暂存区
- git commit -m 'xxx' 提交
- git push -u origin brnach_name 提交到中央仓库
- git branch 查看全部分支
- git branch branch_name 建立分支branch_name
- git checkout branch_name 切换分支
- git checkout -b branch_name 建立分支并自动切换到该分支上
- git branch -d branch_name 删除分支(须要合并分支的指令)
- git brnach -D branch_name 删除分支(无需合并分支的指令)
- git merge branch_name 合并分支