一、 建库
设置自己的名字及email
<span style="font-size:14px;color:#666666;">$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"</span>
创建一个版本库
<span style="font-size:14px;color:#666666;">$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit</span>
二、初始化
初始化一个Git仓库,使用git init
命令。
添加文件到Git仓库,分两步:
第一步,使用命令git add <file>
,注意,可反复多次使用,添加多个文件;如:git add readme.txt
第二步,使用命令git commit
,完成。如:git commit -m "wrote a readme file"
三、Git操作
1.修改文件,然后把修改提交到Git版本库。如对readme.txt进行修改后:
git status 查看仓库当前的状态。
git diff 查看修改的内容 。如:git diff readme.txt
git add添加文件。如:git add readme.txt
git commit提交修改。如:git commit -m "add another sentence"
2.版本回退
git log查看历史记录,若要使每次修改在一行显示:git log --pretty=oneline
若需是readme.txt回退到上一个版本:
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
回退:git reset --hardHEAD^
查看:cat readme.txt
若要返回到新版本:
窗口未关闭:git reset --hard 6a85173(这是提交的id)
窗口已关闭:通过git reflog 查看提交id
3.工作区和暂存区
learngit就是一个工作区,有一个隐藏的.git目录,即版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
3.管理修改4.撤销修改
情况分为三种
1.修改之后未add直接使用git checkout -- readme.txt(撤销工作区的修改)
2.修改之后add了先git reset -- HEAD .txt(撤销暂存区的修改)后git checkout -- readme.txt(撤销工作区的修改)
3.commit之后git reset -- hard HEAD^版本回退
4.删除文件
git rm test.txt
git commit -m "remove test.txt"
四、远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置。
1.添加远程库:
1.首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
2.添加远程库,库名默认origin
$ git remote add origin git@github.com:yanlingwang/learning.git
3.把本地库的所有内容推送到远程库上:
$ git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master
分支的最新修改推送至GitHub。
在本操作中,我遇到了一个问题,如下:
尝试重新输入后遇到另一个问题:
解决办法:
成功!GitHub页面中看到远程库的内容已经和本地一模一样。
若遇到另一个错误fail to push some rifs to git,解决方案:
出现错误的主要原因是github中的README.md文件不在本地代码目录中,可以通过如下命令进行代码合并【注:pull=fetch+merge]
git pull --rebase origin master
执行上面代码后可以看到本地代码库中多了README.md文件
2.从远程库克隆:
git clone https://github.com/yanlingwang/pagetest
五、分支管理
1.创建和合并分支
首先,创建dev
分支,然后切换到dev
分支:
<span style="color:#666666;">$ git checkout -b dev
Switched to a new branch 'dev'</span>
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);">然后,用</span><code style="font-size: 12px; font-family: Consolas, monospace, serif; white-space: nowrap; padding: 0px 4px; border: 1px solid rgb(221, 221, 221); border-radius: 3px; background: rgb(250, 250, 250);">git branch</code><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);">命令查看当前分支:</span>
<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,就可以在dev
分支上正常提交,比如对readme.txt做个修改,加上一行,然后提交。
现在,dev
分支的工作完成,就可以切换回master
分支:
$ git checkout master
切换回master
分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变。应当把dev
分支的工作成果合并到master
分支上,
$ git merge dev
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev
分支的最新提交是完全一样的。
合并完成后,就可以删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);">删除后,查看</span><code style="font-size: 12px; font-family: Consolas, monospace, serif; color: rgb(221, 0, 85); white-space: nowrap; padding: 0px 4px; border: 1px solid rgb(221, 221, 221); border-radius: 3px; background: rgb(250, 250, 250);">branch</code><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);">,就只剩下</span><code style="font-size: 12px; font-family: Consolas, monospace, serif; color: rgb(221, 0, 85); white-space: nowrap; padding: 0px 4px; border: 1px solid rgb(221, 221, 221); border-radius: 3px; background: rgb(250, 250, 250);">master</code><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);">分支了:</span>
<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: pre-wrap; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
六、其它
git push origin develop
操作,并不会定义当前本地分支的upstream分支,我们可以通过git push --set-upstream origin develop
,关联本地develop分支的upstream分支,另一个更为简洁的方式是初次push时,加入-u参数,例如git push -u origin develop
,这个操作在push的同时会指定当前分支的upstream。