题外话
以前不了解git的时候,总感觉git是非常高大上的东西,很长一段时间都没有接触上。但后来用了一段时间后,发现git这个东西真是厉害啊,在厉害的同时它还这么地"接地气",既能让线上线下同步仓库,多条分支工作,也能随时fork别人的优秀的项目来参考学习,真是受用无比。我这人忘性比较高,为方便记忆,特意记录下git 的基本使用。(ps:以下部分截图来自廖雪峰老师的git教程)
正文笔记(以下内容针对windows平台)
首先安装git可以去git官网下载git for windows.
安装好git后在任意一个目录下右键选择 git bash here
配置git的身份
就是如果你想克隆服务器上的仓库,你得告诉别人你的身份
git config --global user.name <your_name>
git config --global user.email <your_email>
创建版本库
//learngit就是仓库所在地方,你可以设为任意名字
mkdir learngit
cd learngit
空仓库初始化
git init
[站外图片上传中...(image-ae70c0-1515859609638)]
这句命令会初始化空仓库learngit,cd 进入 learngit,会发现多了个.git目录,这个目录是git用来跟踪版本库的,一般不要去碰它。
一般仓库下都会有个README.md文件用来对仓库进行必要的说明。
注意:在编辑README.md时不要用windows 自带的记事本保存utf-8编码的文件时会自动在文件头部添加Oxefbbbf(十六进制)的字符。替代记事本:NotePad++,EditPlus,sublime Text3 等。
添加文件到git仓库
//告诉git这是个要放到仓库的文件,放在暂存区
git add README.md
/**
*提交到git仓库,-m 后面是指该次提交的说明信息
*提交成功后会返回提示:多少个文件被提交,插入了多少行内容
*/
git commit -m "update README.md"
版本回退
git log 命令会显示从最近到最久的提交日志,如果嫌输出信息太多,可以在后面加上 --pretty=online参数
[站外图片上传中...(image-75ce58-1515859609638)]
git reset –-hard HEAD^ //HEAD表示当前版本,表示回退到上一个版本,^回退到上两个版本,以此类推,太多数的话可以写HEAD~100
也可以根据commit id号回退到特定的版本,没必要写全,写几个前面的数字就可以,git会自动寻找。
git reset --hard 3628164
现在总结一下:
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hardcommit_id。
- 穿梭前,用 git log 可以查看提交历史信息,以便确定要回退到那个版本。
- 要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的那个版本。
工作区与暂存区
工作区就是在电脑中能看到的目录,比如learngit文件夹就是一个工作区。工作区里有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的即是称为 stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向maser的一个指针叫HEAD
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,此一次性提交到暂存区的所有修改。
比如,你对README.txt(或者README.md)进行修改一下,暂存区就会变成这样:
一旦提交后,如果你没有对工作区做任何修改,那么工作区就是“”干净的“”!nothing to commit.
小结:
- 暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。
管理修改
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。每次修改,如果不 add 到暂存区,那就不会加到 commit 中。命令:
git add <something>
git commit -m "description"
撤销修改
git checkout --README.txt //可以撤销最近一次的修改
有两种情况:
README.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态。
README.txt已经添加到暂存区后,又作了修改,现在,撤销修改就会回到添加到暂存区后的状态。
删除文件
eg:
git rm test.txt
git commit -m "delete test.txt"
如果是删除了的话,可以用 git checkout -- test.txt 来恢复文件。
远程仓库
Github 专门提供 git 仓库的托管服务 。
由于本地 git 仓库和 github 仓库之间的传输是通过 SSH 设置的,因此,需要设置一下 。
1.创建 SSH KEY
ssh-keygen -t rsa -C youremail@example.com
为什么 github 需要 SSH KEY 呢? 因为 github 需要识别出你推送的提交时你推送的,而不是别人冒充的,而 git 支持 SSH 协议,所以, github 只要知道了你的公钥,就可以确认只有你自己才能推送。
2.添加SSH KEY 到 github 或 coding net
github
coding net
添加远程仓库
1.将本地的内容推送关联到 github 仓库
git remote add origin git@github.com:your_usename/repos_name.git
注意账户名不要写错,添加后,远程库的名字就是origin,这是 git 的默认叫法,也可以改成别的。
2.将本地库的所有内容推送到远程库上。
把本地库的内容推送到远程,用 git push 命令,实际上是把本地的 master 推送到远程仓库。
git push -u origin master
如果远程仓库是空的,第一次推送 master 分支时,加上了 -u 参数, git 不但会把本地的 master 分支内容推送的远程到远程新的 master 分支,还会把本地的 master 分支 和远程的 master 分支关联起来,在以后的推送或者拉取时间时就可以简化命令。
若要删除远程仓库的关联,可以用命令: git remote rm hello-world.git
从远程仓库克隆
git clone git@github.com:your_username/repos_name.git
小结:
- 要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone 命令克隆。
- git 支持多种协议,包括 https ,但通过 ssh 支持的原生 git 协议才最快
分支管理
分支可以创建属于个人的工作空间,开发完毕后再一次性合并到原来的分支上,这样安全又不影响别人工作。
创建与合并分支
在 git 中, master 分支也叫主分支,HEAD 严格来说不是指向提交,而是指向 master
首先,创建 dev 分支,然后切换到 dev 分支
git checkout -b dev ,这个命令相当于:
git branch dev
git checkout dev
可以用 git branch 来查看分支,当前分支前面会出现一个"*"号;
git checkout dev 切换分支,回到 master 分支
合并分支: git merge dev ,把 dev 分支修改的内容合并到 master 分支上。
合并完成后,便可以放心删除 dev 分支。
解决冲突
假设这种情况:新建一个分支 future,修改 readme.txt 内容后提交;切换回 master 分支又修改 readme.txt 内容后提交;
[站外图片上传中...(image-d52db4-1515859609639)]
这种情况下,git 无法执行 "快速合并",只能试图把各自修改合并起来 ,但这种合并可能会有冲突。
果然冲突了,git 告诉我们, readme.txt 文件存在冲突,必须手动解决再提交, git status 可查看冲突的文件。
只能手动修改,git用 <<<<<<<,=======,>>>>>>标记处不同分支的内容。修改保存再提交。
可见冲突解决了。
小结:
- 当 git 无法自动合并分支时,就必须首先解决冲突,解决冲突后,再提交,合并完成。用 git log
--graph命令可以看到分支合并图。
分支管理策略
一般合并分支时,git 会用 fast forward模式,这种模式下,删除分之后会丢掉分支的信息,如果要强制禁用 Fast Forward 模式,git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
因为这个合并要创建一个新的 commit ,所以加上 -m 参数,把 commit 描述写进去。合并用 git log 查看操作信息。
git log --graph --pretty=online --abbrev-commit
[站外图片上传中...(image-d52d31-1515859609639)]
Bug分支
软件开发过程中遇到 bug 时可以新建一个分支来修复,修复完成后,合并分支,然后将临时分支删除。
那现场的工作怎么办?git 提供了一个 stash 功能,可以把当前工作现场储藏起来,等以后恢复现场后继续工作。
git stash
修复 bug 后,返回之前的分支
git stash list
查看之前的工作现场。
恢复现场:
git stash apply
git stash drop
//或
git stash pop
推送分支
推送分支,就是把该分支上的所有本地提交都推送到远程库。推送时,要指定本地分支,这样,git 就会把该分支推送到远程仓库对应的分支上。
git push origin master
//或
git push origin dev
bug 分支只用于在本地修复 bug ,就没必要推到远程仓库了。
END