感谢廖雪峰老师官网上的Git教程,让我学习了相关的知识,现在对上一阶段的学习做一些总结(强烈建议学习廖雪峰老师的教程),更多细节参考其网站上的git教程。
安装Git
略过。
在安装后需要先设置相关配置:
$ git config--global user.name "YourName"
$ git config--global user.email "YourEmailAddress"
创建版本库
$ mkdir learngit //在用户主目录下创建目录
$ cd learngit
$ git init //把这个目录变成Git可以管理的目录
$ vim test.txt//写一个你需要放入git仓库的文件
然后我们需要把这个test文件放入Git仓库中
$ git add test.txt //把test.txt添加到暂存区
$ git commit -m "<本次提交你的说明>"//把暂存区所有文件提交到当前分支
注意:
1.add 可以添加多个文件,例如 git add test1.txt test2.txt
2.commit 一次就可以提交多个文件
查看仓库当前状态
$ git status
查看工作区文件和版本库文件的差异
例如你在提交了一次test.txt文件后,有对它做了修改,此时你可以用下面命令查看它们之间的差异
$ git diff HEAD -- text.txt
查看版本库历史纪录
$ git log
输入上述命令,显示的信息很好理解,其中的commit 后面的一大串字符串就是版本号
版本回退
通过查看历史版本的commit_id,你可以轻松回到以前的版本(你只要输入commit_id的前几个字符)
$ git reset --hard commit_id
git中HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^,往上10个版本是HEAD~10
于是你又可以通过以下命令回到上一个版本
$ git reset --hard HEAD^
问题来了,今天提交了一次最新版本v3.0,然后回到了以前的v1.0,通过git log已经找不到v3.0版本的commit_id了,怎么办呢?
1.在终端中找到v3.0的commit_id然后reset,这是你终端没有关闭的情况下。
2.通过以下命令你还是可以找到v3.0的commit_id的:
$ git reflog
然后再reset即可。
撤销修改
- 修改文件还没有添加到暂存区
$ git checkout -- test.txt
上述作用在于把存在在此分支上的test.txt拷贝代替工作区对应文件,其直接作用就是撤销工作区的修改
- 已经添加到暂存区
$ git reset HEAD -- test.txt
上述命令可以把在暂存区的修改撤销掉,然后再重复上面checkout命令撤销工作区修改即可。
- 已经提交到此分支上
进行版本回退。
删除文件
- 删除工作区的文件:
$ rm test.txt
如果发现删除错误,可以用checkout重新拷贝一份。
- 删除此版本库的文件
$ git rm test.txt
$ git commit -m "remove test.txt"
如果发现删除错误,只需要进行版本回退。
远程仓库使用前奏
1.创建SSH key:
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。(引用廖雪峰老师教程原话)
2.添加SSH key到github:
github->setting->SSH and GPG keys->New SSH key->key框中的内容复制id_rsa.pub文件中的内容->add SSH key.
上传到远程仓库
1.假设你想上传到github上的仓库的名字叫test。
2.在本地的仓库里面运行下面命令:
$ git remote add origin git@github.com:YourName/test.git
远程库的默认名字就是origin
3.然后,就可以把本地库的内容全部push上去:
$ git push -u origin master
由于远程库是空的,加上 -u 参数,git不但会把本地分支master内容推送到远程的master分支,还会把两者联系起来,以后推送的时候就可以简化命令,如:
$ git push origin master
从远程库克隆
git clone git@github.com:Name/repository.git
对应换掉Name和repository即可。
实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
远程库一般操作
- 查看远程库信息
$ git remote (-v)//v参数显示更加详细的信息
- 推送
$ git push origin master
$ git push origin dev
- 克隆
$ git clone git@github.com:Username/repository.git
但在默认情况下,克隆后只能看见本地的master分支,如果需要在dev分支上工作,必须创建远程的origin的dev分支到本地:
$ git checkout -b dev origin/dev
当然,每次工作结束后,都要push一下到origin 的dev分支:
$ git push origin dev
- pull解决冲突
由于你的小伙伴的最新提交和你试图提交的有冲突,于是你要用以下方式解决:
$ git branch --set-upstream dev origin/dev //建立本地dev和远程origin的dev分支的链接
$ git pull
//这时会出现合并冲突,你需要先解决冲突,然后再commit,再push
创建分支
$ git checkout -b dev
其实上面等价于:
$ git branch dev
$ git checkout dev
查看当前分支:
$ git branch
你可以在此分支做修改,执行add和commit的命令。
在完事后,你又可以切换分支到master分支:
$ git checkout master
合并分支
- Fast-forwars模式
将dev分支合并到当前master分支上:
$ git merge dev
- –no-ff模式(no fast forward)
再Fast forward模式中,删除了分支会丢掉分支信息,而–no-ff模式会在合并的同时生成一个新的commit,以后就可以通过查看历史就可以看到分支信息。
$ git merge --no-ff -m "..." dev
于是,你可以用:
$ git log --graph --pretty=oneline --abbrev-commit
查看分支历史
但是如果在不同分支修改了同一个文件并且都commit上去的了,而你试图将这两个分支合并,这是会产生冲突的,解决方法如下:
1.先执行:
$ git status
查看冲突文件。
2.修改冲突文件,修改冲突部分,重新add和commit。
3.这个时候冲突已经解决了,你可以查看分支的合并情况。现在你可以删除分支了。
删除分支
$ git branch -d dev
$ git branch -D dev//强制删除分支,即使它没有被合并,删除后数据丢失
保存当前分支工作
假设你现在在dev分支,因为某种情况,你要在其它分支工作,所以你先要保存现在dev分支的工作:
$ git stash
然后你可以切换分支,在其它分支干活了。
干完其它脏活后(- 。-),你重新回到dev分支,你需要重新在此工作:
$ git stash list
你可以看到你保存的工作。
你怎么样取会特定的工作呢?
$ git stash pop // 恢复的同时把stash也删除了
$ git stash apply stash@{n}//恢复指定的工作
$ git stash drop
创建标签
首先切换到需要打标签的分支上,然后:
$ git tag <tagname>
$ git tag <tagname> <commit id> //给特定的commit id 打上tag
查看标签
$ git tag
查看标签信息
$ git show <tagname>
删除标签
$ git tag -d <tagname> //删除本地标签
$ git push origin :refs/tags/<tagname> //如果还要删除远程上的标签,则要加上这一步
推送某个标签到远程
$ git push origin <tagname>
$ git push origin -tags //push all