参考廖雪峰教程
主要是windows上的操作。在其他系统命令一样。
git是一个分布式版本控制系统,非常好用。
github在内的版本控制系统都是追踪文本文件的变化。
github现在已经支持Linux、Unix、Mac和Windows。
linux安装
mac安装
windows安装
注意:安装完后需要进行简单设置
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址
这里写代码片
在windows上我们创建一个空的仓库需要两步:新建一个文件夹和初始化仓库。
初始化仓库命令:
git init
初始化完成后会提示初始化了一个空的仓库。
说明:
1.在windows上需要在仓库文件夹下打开git bash来输入命令,当然你可以在其他地方打开,但是需要将目录切换到这个仓库文件夹.
2.其实我们也可以在任何文件夹下使用这个命令,同样将会让这个文件夹变成一个git仓库。
3.初始化后会生成一个.git的隐藏目录,这个目录其实版本库,不要乱动。
4.git bash就像linux下的中端,同时可以用linux下的命令,包括使用vim(刚发现)。
首先在仓库文件夹下新建一个文件或者复制一个文件过来,如需要添加的文件是readme.txt。然后进行如下操作:
git add readme.txt
git commit -m "wrote a readme file"
说明:
1.add命令后可跟多个文件。
2.commit是一次性提交之前所有add的文件,-m参数是给这次提交添加说明。
查看仓库当前状态(文件修改状态)
git status
查看文件修改内容(还未提交的文件和提交到仓库中的版本比较)
git diff
和向仓库中添加文件一样
git add
git commit
查看日志(很长的那一串叫做提交版本号)
git log //--pretty=oneline参数可以显示的更简洁
$ git log --pretty=oneline
d758dfb6b79f4ea6c9dc2b65646e85ff12c08fd2 commit test.txt
ccedebaf25c4348afa94113108c1505a9c93c100 first change the text
7f686478bd41e31a94ef75eb3f0eeee4e51c5099 add readme.txt
在git中可以使用命令在已经提交过的版本那种来回任意穿梭。
回到之前的某个版本,在git中HEAD表示当前版本,^表示前一个版本,可以有多个^,但是如果回到的版本太过靠前,如回到之前100个版本可用HEAD~100。
git reset --hard HEAD^
git reset
版本回退后我们看不到这个版本之后的版本了。但是如果想恢复还是可以的。这是需要通过我们想要恢复的那个版本的commit版本号(如果你之前通过git log查看过就可以在命令行中找到),版本号不必写全。
git reset --hard 7f6864
如果在进行上述操作后,又退回之前某个版本,并且这次关闭了电脑。你若是想在回到之前的版本,可以通过
git reflog
查看历史操作命令,来找到 git reset –hard 7f6864 这条命令,然后用这个版本号来回退到该版本。
如果你没有版本号好像是有点难已恢复。
就是我们建的这个文件夹。
在我们使用命令 git init 初始化仓库时生成的隐藏目录.git就是我们的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,
同时Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD,在上面版本回退中已经使用过这个head。
在上面我们想仓库中添加文件时执行了两个命令:git add 和 git commit。前者 其实就是将工作区的文件添加到暂存区,而后者就是将所有暂存区的文件加入到版本库得到一个最新的版本。
图来源于廖雪峰教程
上面的git status命令就是查看的文件修改的在工作区、暂存区和版本库的情况。
在git中,它管理的是文本文件的修改,实际上在上面向版本库中添加和提交的是对文件的修改,比如我们就行这样的操作:第一次修改 -> git add -> 第二次修改 -> git commit。实际上这里就只是将第一次修改加入了版本库。
如果我们在工作区对文件进行了修改,但是我们想撤销这些工作区的修改,可以使用命令
git checkout -- filename
这个命令可以让我们的文件回到最近一次git add或git commit的版本状态。
但是如果我们已经将文件的修改添加到了暂存区,我们可以使用命令
git reset HEAD <file>
撤销暂存区的修改到工作区。如果想继续撤销修改到之前的版本,再继续用git checkout – filename命令。
如果我们修改了文件并且还已经commit到了版本库,发现修改错误,不急,可以版本回退到之前的版本。
删除工作取文件,直接delete或者rm命令。但是并没有删除版本库中的文件。因此如果你误删工作区的文件还可以通过版本库来恢复,使用命令
git checkout -- filename
来恢复,这个命令其实是用版本库中最新的版本来替换工作区的版本。
从版本库删除文件使用命令
git rm
git commit //这里也可用 git add命令
如果你把版本库的文件版本删了,无法恢复。
远程仓库可以用来进行备份,也可以用来和他人协作,想使用远程仓库,需要到github官网注册账号,github提供免费的仓库托管服务,或者你自己搞个服务器也行。
注册完账号后,新建一个仓库,然后就可以关联本地仓库和这个远程仓库了。但是因此仓库之间的传输时通过SSH加密,为了确保是本人推送,所以在关联前你需要将自己的SSH公钥添加到自己账号下。github需要添加多个SSH公钥,因此你可以在多台电脑上推送。
在linux终端或者git bash里面输入命令
ssh-keygen -t rsa -C "[email protected]"
一路回车,使用默认配置。
然后就可以到用户主目录下找到了。比如我的目录是
C:\Users\dhc\.ssh
里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
而我们就是将公钥添加到github网站的账号里。
注意github的仓库都是开源的,他人不能修改但是可以看到,因此不宜放私密文件,如果想使用私有仓库,可以交钱或者自己搞个服务器。
关联前我们先创建一个远程仓库,创建时除了名字,其他保持默认设置。创建完之后,我们就可以和它关联,然后就可以将自己本地仓库中的文件推送到远程仓库,也可以从远程仓库克隆。
使用命令
$ git remote add origin git@github.com:breezeDHC/Simple-Spider.git //后面使用自己的仓库地址
来关联,origin是默认的远程仓库名,可以更改。
使用命令
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,不用-u参数了。
使用命令
$ git clone git@github.com:breezeDHC/Simple-Spider.git //后面使用自己的仓库地址
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https
当我们多人协作时,使用分支是一种很安全的方法。
git把我们每次提交串成一条时间线,如果我们不另外创建分支的话,默认的只有一个master主分支。
在上面版本回退时使用过的HEAD实际上是指向当前分支的指针,即在主分支时其实是HEAD指向master,master才指向当前分支的当前提交版本。当我们创建分支,如b1,并且切换到分支b1时,这时就是HEAD指向b1。
并且我们在不同的分支上进行文件的修改提交是互不影响的,比如我们在b1分支上对某个文件进行了修改并且比较到版本库,我们在其他分支看到的任然是修改前的版本。
如果我们想要让其他某个分支的修改更新到自己分支,可以用分支合并。
有关命令如下:
git branch //查看所有分支和当前所在分支
git branch 分支名 //创建分支
git checkout 分支名 //切换分支
git checkout -b 分支名 //创建分支并切换到分支
git merge 分支名 //将分支合并到当前分支(好像不能讲较新版本的分支合并到旧版本的分支)
git branch -d 分支名 //删除分支
当我们在不同分支上对同一个文件进行了修改后并且都提交到了各自的版本库,这是如果我们合并的会产生冲突,无法合并,如果这是你查看文件就会像
<<<<<<< HEAD
change on master
=======
change on b1
>>>>>>> b1
这样其中<<<<<<、=======、>>>>>>>>是表示文件中冲突的部分。
遇到冲突我们需要手动对文件进行修改合并,然后在使用
git add
git commit
命令,即可。
遇到冲突时,也可以通过git status查看冲突情况。
使用命令
git log --graph
可以查看分支合并情况。
在上面Git合并分支时用的是Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果我们不适用这种模式合并时会生成一个新的commit,在分支历史上就可以看到分支信息。
使用命令
$ git merge --no-ff -m "merge with no-ff" b1
其中 –no-ff表示不使用 fast forward模式,因为生成新的commit因此用-m增加说明。
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
分支策略
master分支应该是稳定,一般仅仅用来合并比较完善的代码,一般多人合作时每个人有自己的分支,这个是每个人的工作分支,提交时也不应直接提交到master分支,而是先保存到一个专门的分支,当这个分支代码完善在提交到master分支上。
一般我们解决某个bug时,会新建一个分支来解决,解决完之后然后合并到master。
当我们在分支b1上进行工作时,但是还没有工作完所以还不能提交,但是必须要先解决解决bug,这是如果直接切回master创建bug分支进行解决合并可能会影响到b1分支,这是我们可以先保存b1分支的工作现场,当解决完后再回复即可。
使用命令
git stash
保存现场。
恢复现场时可用命令
git stash pop //恢复到现场并删除stash内容
git stash apply //恢复不删除
git stash drop //删除stash内容
好像是保存的是暂存区的工作现场,也就是说你要先git add到暂存区。
当我们开发新功能时,和解决bug一样,新建一个分支,功能晚上后,在合并删除,但是如果功能完善后,我们不需要这个分支上的内容,需要删除这时需要强制删除,使用命令
git branch -D 分支名
从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
查看远程库信息
git remote
git remote -v
推送本地分支到远程库对应分支
git push origin master //将推送到主分支
并不需要将自己本地所有分支推送到远程。
如果远程库不存在这个分支,会建立这个分支。
多人协作时推送会存在冲突。
冲突1:比如你的某个小伙伴增加了一个文件或者修改了一个文件,当你推送时会推送失败,这时是需要将你的小伙伴增加的文件或者修改的文件更新到自己的分支版本库,使用命令
git pull
这时再推送就可以了。
冲突2:你推送的版本是和你的小伙伴推送的区别只是你们修改了同一个文件,这时就象上面的合并分支冲突一样,需要先git pull下来,这时你可以看到小伙伴和你修改的不同,这时就和上面一样要手动解决冲突,然后git add、git commit、git push。命令如下
git push //冲突
git pull //将小伙伴的修改更新到自己的版本库中
修改解决冲突
git add
git commit
git push
如果我们需要在远程仓库的某个如dev分支工作,则需要将远程的分支同步到本地,使用命令
git checkout -b dev origin/dev
然后就可以在本地工作,然后推送到远程仓库。
git pull时可能会提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,因此使用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
来建立连接。