git使用摘要
git:分布式的版本管理工具,正在流行,就学了一下,入了门,记个笔记。
原理
- 跟踪文件的修改:
git记录文件的每一次修改,形成时间记录节点。每一个节点是一次提交记录,通过特异的16进制字符串标识(分布式情况下为了特异性标识一次提交,标识字符串需要计算得出,我猜计算需要用到到user的email,时间,提交message等信息) 工作区与版本区、暂存区:
工作区:我们修改文件的文件夹成为工作区,所有日常的编码工作就在此进行
版本区:这个地方我们由git管理,位于文件夹.git下,用于记录文件的修改
暂存区:位于版本区内,类似于缓存,我们可能一次只提交了一个文件的修改,每次都commit形成的节点太多,每个节点也不一定有意义,所以设立暂存区,通过add命令,先将修改的文件加入暂存区,等多个文件足够成为一个节点(有版本更改的意义)时,commit掉通过指针指向现在版本位置,方便版本切换:
每一次提交并没有抹去上一次的节点,而是在上一次节点之上新加入一个节点,然后git将head指针(指向当前版本)指向新节点,也就是说如果想要回滚到以前版本,只需要将head指针的指向改到指定节点就行了- 分支:
版本管理一定要用到多人合作开发的场景下的。多人合作,就涉及到了对一个工程不同部分的同时修改,这是需要分支了。分支是git提交时间节点的分支。可以让每个开发人员持有一个工程的一个节点,每个开发人员在此节点上分出每个人的提交节点,形成分支,最后将自己完成的分支合并到工程主分支上。分支内部也是通过git的指针完成切换的,指针仅仅标记当前开发在哪一个分支的节点上,剩余的功能,比如文件的校对,记录文件的修改并不属于指针的职责范围。因此,git的分支切换,版本切换是很快的,只需要修改一个指针信息即可。
使用习惯
- 多次add,然后commit:
commit表示一次版本的更迭,所以commit最好有意义。为此,对于文件的修改,最好将为了同一目的的修改一齐commit,在此之前修改好一个或几个文件,可以先将它们add到暂存区,缓存起来,等这一块功能修改完毕后统一commit - 多使用分支
不同于SVN对分支支持不好,git推荐使用分支,我看 廖雪峰的git教程 理解了一下,有如下原则:
- master作为主分支,应当足够稳健,只用于版本发布,保证每一次commit的都是正确的,而且一般是大改动
- 由master分出来的dev分支作为工作时的主干分支,用于多人开发时每个开发人员分出自己的分支,多人开发完成后合并。
- 每一位开发人员从dev得到一份自己的分支(可能用自己的名字命名此分支),自己的工作在自己的分支做完了,就向dev分支合并。因此,这个自己的分支对于我们自己来说也是很稳健的,不能允许实验性质的代码毁坏它
- 对于实验性质的代码,还需要feature分支,此分支用于开发人员自己瞎搞,最后搞出来成功就合并到3中提到的自己的分支中,然后删除feature分支
- 对于bug,在自己的分支上修改也是不好的,需要新开bug分支,修复好bug之后合并到自己的分支上,然后删除bug分支信息
不得不说,规矩还是很多的,还要实践中多注意。
- 提倡保留痕迹,而不是删除痕迹:git能检测到工程的每一次修改,也就是说好的坏的它都能“看到”,也许有人不喜欢这种我敲的烂代码被别人看到的感觉,想把git的记录删掉,但是按使用习惯和最佳实践来讲,还是保留git的每一次记录的好,方便以后版本回退,留后路。而且,其实没人一次次看那么多次git的提交记录的,就自己在出问题的时候会仔细看。
常用指令
以下命令都是在git 的brash下的,如果在windows上需要先安装相应的git程序,同时作为指令清单,这里没有讲解,需要讲解可以参看后文的参考博文,两篇本文内都有详细的讲解
1. 最常用:
- 设定用户名、邮箱:用于指定git的用户,如果全局(本机)上都用一个git账户的话,可以在
config
后加参数--global
git config user.name "yourname"
git config user.email "youremail"
- git仓库初始化:新建一个文件夹作为git仓库,需要首先初始化,让git创建.git文件夹,指令是
git init
- 指定远程仓库:现在git经常和github是连在一起的,github最为最大的git仓库,不在本机,需要我们制定远端仓库与其关联
- 首先,应当有SSH的密钥,没有需要先创建:
ssh-keygen
- 将ssh的公钥(后缀有.pub的)拷到github的SSH设置里,ok,SSH的设置结束了
- 当在github上创建新仓库时,复制SSH的地址
- 在git 的brash下键入
git remote add origin yourGitHubSSHAddress
- 首先,应当有SSH的密钥,没有需要先创建:
- 删除远程仓库关联
git remote rm origin
- 增加修改到暂存区:即上文提到的add
git add
,如果要将整个文件夹都增加(也就是嫌麻烦,不想打具体修改的文件的名字),可使用git add --all
- 提交:即上文提到的commit
git commit -m "yourmessage"
,每一次提交都需要使用参数-m ,来加入提交的信息,引号内可以敲个空格掠过,但推荐写明意义 - 推到远程服务器:如果没有先前指定remote的话,每次推送都需要加入远程主机的地址
git push origin master
这是推到了远程的master分支上 - 拉取远程服务器分支:一般而言,每次提交之前都需先拉一下,确保本地代码不会覆盖远程服务器由其他人修改的新代码
git pull origin master
依旧是拉取master分支 - 回退到上一次提交节点:soft参数不会将工作区、暂存区重置,hard参数会重置到上一个状态的;head^表示上一个commit,head^^就代表上上个,为了简化,可以使用head~num的形式回退
git reset --soft head^
以及git reset --hard head^
- 前进到下一次提交节点:回退之后,后悔了,如何再前进到下一次的提交节点呢?
git reflog
使用此命令查看回退节点操作的节点ID,然后使用命令git reset --hard/--soft theIDyouFind
就行了 - 创建分支
git branch yourBranchName
- 切换分支
git checkout otherBranchName
- 合并分支到当前分支
git merge otherBranchName