git用于管理代码的不同版本,能够很快恢复到过去时间段的某个状态。同时在多人合作共同开发中,对于代码的修改与发送,都非常的轻快便捷,不同像在QQ群之间相互传代码的zip压缩包那样麻烦;不会疑惑其他人对代码做了哪些修改。Github/Gitee是运用互联网的思维,将代码存储在上面,通过互联网,我们才能够相互将代码分享。
而对于如何使用git来管理代码,这还需要熟悉一些原理与git命令操作,这样才会得心应手。
Git功能
- Tracking multiple files together
- Tracking change
- Tracking history version (tracking 跟踪)
本机离线操作
在自己的电脑上管理代码local,其中涉及到三个空间概念: working directory存储在硬盘上的普通文件,staging area与add有关和repository与commit有关
concept map
git -version
查看git的版本
git log
查看提交的日志,其中那一串数字是commitID指向每个历史版本,按照时间从现在往之前推。q退出。
git log --graph --oneline
查看分支合并情况,类似图形界面
也可查看专门的分支
git log --graph --oneline master 分支名称
git diff
git diff commitID(之前) commitID(之后)
比较在repository中两个版本的不同,如取3aa08b92180bea3f594340f87d0d51e4a99edd87与d07738fb19f551ea8d767f9fde6c4b702d0923ef进行比较,通过颜色或(-,+)等信息观察变化,可以只输入前面四个字符即可
表示新添了内容,该内容是新信息
git diff
场景: 该文件已经通过add加入到了staging area但是未加入到repository,而此时你去处理别的事情了(比如上厕所),回来的时候你想知道staging area的文件是否是最新的文件,因为你可能忘了,将该文件加入staging area后你是否又修改了该文件。
比较的是同文件在working area与staging area的状态
git diff --staged
比较的是staging area与repository中最新的”快照”
git checkout
git checkout master
回到主分支
git checkout 分支名称
该分支可以是本地的分支,也可以是远程的分支
切换到该分支
git checkout commitID
access old versions of files.可以回到这个commitID指向的当时版本。使用它,我们可以查看bug在那一次提交引入的。
git init
将一个文件夹初始化为一个 git repository(git 仓库)
git status
查看当前的文件状态,是否是添加到repository中还是在staging area状态
git add
将文件加入到staging area准备提交到本地的repository
git add . 表示将全部文件添加到staging area中
git add 文件名 只将该文件加入
git commit
A commit is a snapshot of git repository(快照)
提交commit会记录打log日志中,为了日后方便通过日志来跟踪代码的更改,应该遵循的原则是:
It‘s make one commit per logical change and give each commit a good message.(每跟换一次逻辑,进行一次提交)
git commit直接回车会打开sublime编辑器,进行更加详细的信息编辑(前提是需要配置sublime)
也可以使用git commit -m "message"在命令行快速写入信息
配置sublime
切换到Home目录下
cd ~
在Home路径下创建.bash_profile文件,在文件中添加,sublime的安装路径,注意转义
alias subl="C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe"
以后就可以在bash下使用subl 文件名来打开文件进行编辑
git branch
git branch
查看当前有哪些分支
git branch 分支名称
创建该分支
为什么创建分支
比如开发一个游戏正版的难度是3星,但是你觉得太难,于是想改代码实现一个2星级别的,但是正式版本是3星,你能让正式版本变成2星,于是你需要在这个基础上开一个分支,在该分支上你可以自己改写代码而不用影响主支master的代码。换而言之,你可以在分支上干自己想干的事,大胆的更改代码,而不用担心影响主分支master
git branch -d 分支名称
删除分支
git merge
合并分支,将两个分支上的代码,合并整合到一个分支上,其中不可避免的时conflict(冲突)
git merge branch1 branch2
将分支branch2合并到branch1
相当于 git checkout branch1 然后 git merge branch2
git merge --abort
取消合并
冲突问题
当冲突发生时,查看发生冲突的文件,这时候两个分支都是对原来的状态进行了修改,需要打开文件进行改写。如:
打开subl hello.txt文件,处理冲突:
<<<<<<< HEAD 表示HEAD指向的当前分支,此时为: different-oil
different information.
||||||| merged common ancestors 表示原始的内容,此时表示原来是空的
=======
master money
>>>>>>> master 表示master分支改动的地方
以上信息表示,master与different-oil都对原来的hello.txt状态进行了内容的增添,所以我们处理成这样,将两个分支添加的内容都添加进来。
different information.
master money
git show commitID
因为两个分支合并后,commit的时间是交错的,要想查看这个commit的快照与在合并之前的分支上的前一个commit快照的对比,这个命令可以做到。
compare a commit to its parent
Fast-forward-Merges
merging into is an ancestor of the branch that you're merging from
Github与本地local
Concept Map
SSH Key
在 ~/.ssh目录下
$ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "github_id_rsa"
$ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "gitee_id_rsa"
ssh -T git@gitee.com
ssh -T git@github.com
git remote
git remote
显示本地仓库与远程Github仓库上的连接
git remote -v 显示详细信息 v指verbose
git remote add origin git@...
将自己本地仓库与github仓库关联起来。(在github上新建一个repository最好勾选上README.md这样会产生第一次提交,然后在本地仓库执行该命令)注意与git clone的区别
关联之后就可以使用 git push origin master 或 git push origin 分支 往github上提交文件了。(前提是要分配好SSH Key密钥) 其中origin代表远程
git remote add
git clone git@...
将github上的仓库克隆下来,作为本地的仓库。
git pull
当远程的Github仓库的内容改变时。
拉取Github上的代码与本地仓库的代码进行合并。
如果仓库只有自己一个人使用,那么在线上即Github上更改了某个文件,此时就需要git pull origin master远程的代码下来,进行合并,解决冲突。更常见的情况是,多人向一个仓库贡献代码,此时在你就需要pull远程,在本地解决冲突后,在pull request到贡献的仓库。
git pull origin master 相当于 依次执行了 git fetch origin 和 git merge master origin/master
fork
这是在github通过fork其他人的仓库,将该仓库复制到自己github上的仓库中。
fork & clone & branch之间的区别
pull request
这个是在github上操作的,表示向fork的项目贡献代码。如: 在自己本地仓库(clone的fork的那个仓库)中创建了一个分支,在该分支上我们进行代码修改,然后将分支提交到我们fork的到自己github的仓库,然后在自己的github上的这个仓库上进行pull request.
当我们进行pull request后,fork的原来的项目的主人会受到信息,然后查看你pull request过去的版本是否符合要求,然后决定是否合并到他的项目master中。
pull request冲突
如:
1) 在自己的分支上修改,pull request到fork的原生项目时,发现有冲突
2) 在自己本地仓库中切换到master主分支,然后git pull拉取远程fork的仓库的master,因为我们修改代码都是在其他分支上,master主分支与远程的master合并时是Fast-forward merges,一般不会有冲突。
git pull 远程fork的SSH地址
或者
git remote add upstream 远程fork的SSH地址 //这个只执行一次就好
git pull upstream master //以后再拉取远程fork仓库的代码时,就执行这个即可
3)将master更新git push orgin master到自己github的仓库
4)切换到分支,与master进行合并,解决冲突,在提交到自己的仓库,进行pull request
各个空间的改变
Courses
Problem
git pull
Problem-1
fatal: refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
Problem-2
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream develop origin/<branch>
git pull origin master