https://backlog.com/git-tutorial/cn/intro/intro1_1.html
https://backlog.com/git-tutorial/cn/stepup/stepup1_1.html
https://backlog.com/git-tutorial/cn/reference/
简介
主要是解决平常开发过程中维护一个项目的版本更新状态和内容,通过git可以查看每个版本的改动情况,以及回退到以前的某个版本。git更加方便多人协同开发。
概念
- 仓库 : repository, 是用来记录档案和目录状态的地方,存储内容修改历史记录;还可以追踪内容的状态和版本。
- 远程仓库:远程仓库配有專用的伺服器,為了讓多人共享而建立的數據庫。
- 本地仓库,為了方便用戶個人使用,在自己的機器上配置的數據庫。
- 建立仓库: 通过新建仓库和复制远程仓库。
- 提交:如果要把变更更新到仓库,需要进行commit, 在commit的时候需要填写提交信息,方便跟踪版本时候更容易知道该笔提交是修改了什么内容。
- 工作目录:是保存您目前正在處理檔案的目錄,Git 相關的操作都會在這個目錄下完成。索引(Index )位於工作目錄和數據庫之間,是為了向數據庫提交作準備的暫存區域。
- push: 把本地添加到索引并commit到本地仓库的改动推送到远程仓库
- clone: 复制远程仓库
- pull: 拉取,同步遠端數據庫以更新本地端數據庫,請使用Pull(拉取)。
所以在工作目錄上做的任何變更並不會直接提交到數據庫的。Git在執行提交的時候,不是直接將工作目錄的狀態儲存到數據庫,而是將索引的狀態儲存到數據庫。因此,要提交變更,首先必需要把變更內容加入到索引中。索引的存在可以排除工作目錄裡不必要的檔案提交,還可以只將檔案變更內容的一部分加入索引並提交。
origin/master
代表遠端數據庫「origin」的「master」分支位置。
origin/HEAD
代表遠端數據庫「origin」當前提交的位置。通常和「origin/master」的位置相同。
master
代表本地端數據庫的「master」分支位置。
-
合并修改记录:
您上次的push到執行下一次的push的期間,如果有其他人push更新了遠端數據庫,而您沒有更新您的本地端數據庫,那麼您的push會被拒絕。
image.png
這個時候,需要進行合併操作導入其他人的修改歷史,不然push都會被拒絕喔。若沒有合併直接覆蓋歷史記錄的話,其他人push的修改內容(如圖提交C)會消失。
Git執行合併可能會自動合併修改的部分。但是也可能有不能自動合併的時候
冲突: 如果遠端數據庫和本地端數據庫的同一個地方都發生了修改的情況下, 這時,因為Git不能自動判斷要導入那一個修改內容於是就會發生錯誤。需要手动修改。
分支:在开发软件时,可能有多人同时为同一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。所幸,Git的分支功能可以支持同时进行多个功能的开发和版本管理。
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。
为了不受其他开发人员的影响,您可以在主分支上建立自己专用的分支。完成工作后,将自己分支上的修改合并到主分支。因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了。
master分支: 在数据库进行最初的提交后, Git会创建一个名为master的分支。因此之后的提交,在切换分支之前都会添加到master分支里。
merge分支: Merge分支是为了可以随时发布release而创建的分支,它还能作为Topic分支的源分支使用。保持分支稳定的状态是很重要的。如果要进行更改,通常先创建Topic分支,而针对该分支,可以使用Jenkins之类的CI工具进行自动化编译以及测试。
通常,大家会将master分支当作Merge分支使用。Topic分支:Topic分支是为了开发新功能或修复Bug等任务而建立的分支。若要同时进行多个的任务,请创建多个的Topic分支。Topic分支是从稳定的Merge分支创建的。完成作业后,要把Topic分支合并回Merge分支。
分支切换:git checkout branchname / git checkout -b brachname
HEAD: HEAD指向现在使用分支中最后一次的更新,通常指向master分支的最后一次更新。
HEAD~: HEAD~才是回退的步数
HEAD^:主要是控制merge之后回退的方向
stash: 在分支内容还未提交,在暂存区的时候可以通过这个来临时保存,然后切换分支, 之后切换回来后在pop
分支合并: 完成作业后的topic分支,最后要合并回merge分支。合并分支有2种方法:使用merge或rebase。使用这2种方法,合并后分支的历史记录会有很大的差别。
merge
保持修改内容的历史记录,但是历史记录会很复杂。
rebase
历史记录简单,是在原有提交的基础上将差异内容反映进去。
因此,可能导致原本的提交内容无法正常运行。
分支工作
主分支: master分支和develop分支.master
master分支只负责管理发布的状态。在提交时使用标签记录发布版本号。develop
develop分支是针对发布的日常开发分支。刚才我们已经讲解过有合并分支的功用。
特性分支: 这个分支是针对新功能的开发,在bug修正的时候从develop分支分叉出来的。基本上不需要共享特性分支的操作,所以不需要远端控制。完成开发后,把分支合并回develop分支后发布。
release分支:release分支是为release做准备的。通常会在分支名称的最前面加上release-。release前需要在这个分支进行最后的调整,而且为了下一版release开发用develop分支的上游分支。一般的开发是在develop分支上进行的,到了可以发布的状态时再创建release分支,为release做最后的bug修正。到了可以release的状态时,把release分支合并到master分支,并且在合并提交里添加release版本号的标签。要导入在release分支所作的修改,也要合并回develop分支。
hotFix分支:hotFix分支是在发布的产品需要紧急修正时,从master分支创建的分支。通常会在分支名称的最前面加上 hotfix-。
操作实例
新建git库: git init
添加跟踪: git add file
提交修改: git commit -m "information"
新建分支: git branch <branchname> || git branch -b <branchname>
查看分支: git branch
切换分支: git checkout <branchname>
合并分支:
git merge <commit> //当前分支为fixbug
git checkout master
git merge fixbug
删除分支: git branch -d <branchname>
合并分支2:
git rebase master
git add somefile
git rebase --continue //提交rebase的时候,修改冲突后的提交不是使用commit命令,而是执行rebase命令指定 --continue选项。若要取消rebase,指定 --abort选项。
git checkout master
git merge fixbug
远端仓库
- 执行pull可以取得远程数据库的历史记录
- 执行pull,远程数据库的内容就会自动合并。但是,有时只是想确认本地数据库的内容而不想合并。这种情况下,请使用fetch。执行fetch就可以取得远程数据库的最新历史记录。取得的提交会导入到没有名字的分支,这个分支可以从名为FETCH_HEAD的退出。
- 从本地数据库push到远程数据库时,要fast-forward合并push的分支。如果发生冲突,push会被拒绝的。
标签
给HEAD指向的提交中添加标签
添加:git tag <tagname> || git tag -am "连猴子都懂的Git" banana
显示标签:git tag
查询历史记录中的标签提交: git log --decorate
删除标签:git tag -d <tagname>
修改提交
- 在revert可以取消指定的提交内容
- 在reset可以遗弃不再使用的提交
复原修改过的索引的状态(mixed)
彻底取消最近的提交(hard)
只取消提交(soft)
- 在cherry-pick,您可以从其他分支复制指定的提交,然后导入到现在的分支
把弄错分支的提交移动到正确的地方
把其他分支的提交添加到现在的分支
- 在rebase指定i选项,您可以改写、替换、删除或合并提交。
在push之前,重新输入正确的提交注解
清楚地汇合内容含义相同的提交。
添加最近提交时漏掉的档案
- 我们介绍一下merge的特殊选项:squash, 用这个选项指定分支的合并,就可以把所有汇合的提交添加到分支上。
汇合主题分支的提交,然后合并提交到目标分支。
操作实例
修改提交
git add sample.txt
$ git commit --amend //修改了上一次的提交内容
https://backlog.com/git-tutorial/cn/stepup/stepup7_1.html
取消提交:git revert HEAD
删除提交
$ git log
连猴子都懂的Git命令
add 把变更录入到索引中
commit 记录索引的状态
pull 取得远端数据库的内容
git reset --hard HEAD~~ // 用reset删除提交。
git reset --hard ORIG_HEAD //还原到reset前的状态。
git cherry-pick 99daed2
若要汇合过去的提交,请用rebase -i。
git rebase -i HEAD~~
rebase修改提交:
git add sample.txt
git rebase --continue
merge --squash切换到master分支后,指定 --squash选项执行merge。
git merge --squash issue1
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.
git commit
[master 0d744a7] Conflicts: sample.txt
1 files changed, 4 insertions(+), 0 deletions(-)
更多资料
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%8E%B7%E5%8F%96-Git-%E4%BB%93%E5%BA%93