安装git
mac安装git有两种方法
1、安装了homebrew了以后,通过命令行 brew install git
2、从appstore直接安装xcode,xcode中集成了git。运行xcode ->选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
创建版本库
1、在一个合适的位置创建空目录 mkdir 目录名
为确保不出乱七八糟的问题 ,建议创建目录的时候不要带有中文
可以通过 pwd
命令来查看当前位置的绝对路径
2、通过 git init
将创建好的目录变成git可以管理的库,执行过后会生成一个.git的目录,这个目录是跟踪管理按本库的。不能随意更改。
3、在创建好的目录下通过 git add 文件名
将文件添加到仓库,如果没有提示的话就是添加成功了。然后需要
git commit -m '"提交说明"
提交说明是方便自己查看。提交成功后会提示改动了哪些内容。
版本穿梭
版本回退
当文件丢失或者其他等等,可以通过版本回退来回退到以前的一个版本。
1、通过 git log
可以查看之前的版本,通过查看到的版本来选择回退
2、通过回退代码 git reset --hard HEAD^
回退到上一个版本,如果需要回退多个版本可以使用 git reset — hard HEAD~你要往上回退多少个版本
3、如果你后悔了版本回退,想恢复到原来的版本,通过 commit id 来恢复版本。git提供了一个命令:git reflog
来查看自己的每一次命令
使用命令git reset --hard commit_id
来穿梭版本
工作区和暂存区
我们创建的文件夹是工作区,init后产生的.git文件夹是我们的版本库其中的stage就是暂存区。在.git中Git为我们创建了master,以及指向其的一个指针HEAD
git add
是提交到了暂存区 可以多次add然后一次提交
git commit
是将暂存区中的所有内容提交到当前分支中(master)
通过 git status
来查看stage中的状态
理解工作区和暂存区,以及暂存区中的stage和master
管理修改
git跟踪的是修改,当你修改一个文件中的内容,并且 git add
后,这些修改的内容保存到了暂存区。此时你再修改这个文件中的内容。当你 git commit
的时候,提交的只是第一次修改的的内容,即暂存区中的内容。第二次的修改并没有 git add
到暂存区中,所以并不会提交。
如果需要提交第二次修改的内容的话还是需要 git add
如果不 git add
到暂存区,git commit
的话就不会提交到分支中
撤销修改
当你对一个文件进行了修改后,在git add
之前你发现不能这么修改,你需要删除刚才增加的一行。这时候你可以通过 git checkout -- file
来撤销修改,这种操作会回退到最近的一个版本
注意:git checkout --file
中的 - -很重要,如果没有 - - 那么这命令就变成切换另一个分支了
现在你写了一句错误的代码并且已经 git add
到暂存区了,然而你发现了错误,还没有commit。这时候怎么将暂存区中的内容回退到工作区中呢?
首先通过 git reset HEAD file
将暂存区中的内容回退到工作区中,再用 git checkout -- file
丢弃工作区中的内容。
小结:场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
从版本库中删除文件使用:git rm file
然后提交 git commit -m ""
也可以直接 rm file
直接删除,如果是使用 rm file
删除文件的话可以通过 git checkout -- file
来回退工作区删除的文件
如果是 git rm file
并且以及提交了,这时候通过 git reset --hard commit_id
来回退版本 或者通过
git reset --hard HEAD^
来回退到上个版本
远程仓库
添加远程库 (本次是在github上建立的远程库)
1、添加远程仓库,这里是github上建立的一个仓库
$ git remote add origin git@github.com:lindong53/learngit.git
通过如下命令来关联远程仓库
git remote add origin git@server-name:path/repo-name.git
看到这里我茅塞顿开了。哭。
通过 git remote -v可以查看远程库中已存在的远程分支以及其远程url
首先查看状态 git status
可以看到文件的修改(这时候应该看到了一堆红色的,这是还没有add的),这时将工作区的内容add到暂存区中 git add .
(这时候再 git status
的时候看到了之前红色的都变成绿色了。)这时候可以 git commit -m ""
对add的进行一个注释,说明? 此时你就可以通过 git push origin master
将本地版本库推送到远程服务器的master分支上去了。
通过远程库的ssh地址来克隆到本地
1、在本地创建一个存放项目的文件夹
2、把项目的ssh地址复制下来
3、cd 命令进入文件夹,使用 git clone ssh地址
克隆到本地
然后 git pull origin master 是将远程仓库中的master分支同步到本地仓库 master中
分支管理
创建以及合并分支
首先理解分支,在git里有个分支叫master,这是一条主分支。可以有多个分支
这里我自己打个比方:比如工人开挖一条河 河1(master)是主河,工人(HEAD)每天就挖一点,老板给了钱(提交或者修改)工人正在挖的这条河1就会往前推进一点。这时候老板说另外开一条河 我就叫这条河为河2(dev),现在工人们都去挖河2了。因为资金充裕,河2一直在向前挖着。然而这时候,老板说要把两条河合并在一起,这时候就需要工人重新去河1去挖。总结就是**工人(HEAD)**到哪儿,挖到哪儿。
创建分支并切换到此分支的命令 g
查看当前分支:git branch
查看远程分支,以及当前所在的分支 : git branch -a
合并分支到当前分支,一般都是合并到master这个主分支上? git merge <name>
删除分支:git branch -d <name>
解决冲突
当你再分支dev上修改了,并且add到暂存区了,这时候你切换回master分支,也对同一个文件进行了修改并且 add到暂存区了。这时候你合并dev分支到master(反正就是合并两个分支)会产生冲突,到底用谁的呢?
git status
可以告诉我们冲突的文件,并且有提示语句,让我们选择一个分支内容作为最终保存的内容。执行完成后,我们可以通过 git log
来查看分支合并的情况
分支管理策略
在合并分支的时候,git默认是采取 Fast forward模式的,这种模式在删除分支的时候会丢失分支信息。
通过禁用 Fast forward模式,在合并分支的时候会产生一个新的commit,这样就可以在分支历史(git log
)上看到分支信息了。
$ git merge --no-ff -m "merge with no-ff" dev
--no-ff
:禁用Fast forward模式 ,因为会创建一个新的commit 所以加上 -m参数把commit描述写进去
BUG分支
1、当你在进行一个任务(dev)的时候,这时候有一个紧急的bug需要修改。而你还不能提交正在进行的任务,而这个bug(master上)又需要马上修复。这时候可以将dev这个任务暂时的缓存起来。切换到dev分支使用命令
git stash
这时候 git status
查看工作区就是干净的。
2、现在要修复master分支上的bug了 ,切换到master分支 git checkout master
并且创建新分支解决bug
git checkout -b bug
修复完成后,切换到master分支完成分支的合并
git checkout master git merge --on-ff -m "修改bug" bug
3、好了,现在bug修改完了,我们切换到dev分支,将缓存区中的内容还原到工作区中
通过git stash list
查看缓存区中的内容列表,现在有两种方法来恢复。第一种就是通过 git stash apply
来恢复,这种方式恢复后并不会删除stash区中的内容需要手动的 git stash drop
来删除stash区中的内容
另一种方式就是 git stash pop
这种方式会恢复内容并且删除stash区中的内容,也可以通过 git stash pop/apply stash@{0}
来指定恢复的stash
多人协作
两个人同时在一个分支上开发,而且两人对同样的文件进行了修改,此时是他先上传的,你后上传。你push的时候会提示推送失败,因为文件中有冲突。首先需要先从远程库中 git pull
到本地,在本地合并,解决冲突后再提交。
多人在同一分支上协同开发的时候很容易出现冲突,即使没有冲突,后提交的人也需要先pull在本地完成合并在进行push才能成功
保存本地修改,以及恢复
1.git stash
保存本地修改
2.git pull origin master
pull内容到本地
3.git stash list
查看本地保存内容,通常是 stash@{0}…
4.git stash pop stash@{list.num}
来恢复保存在暂存区的内容到本地