git学习笔记

来源:互联网 发布:隐形口罩 知乎 编辑:程序博客网 时间:2024/06/05 19:06

为什么现在很多人提倡软件开源? 对此,我也心存疑问,在看了很多社区的讨论和度娘的讲解,对这个问题有大概的了解。

1. 软件开源,更能够让软件中的问题暴露出来,没有不存在bug的代码

2. 软件开源能够保护用户的利益,若微软有一天不复存在了,那windows可能就没有人维护了而被淘汰,开源软件则大大减少这种情况发生的风险

3. 软件开源能够让用户个性化需求得到满足


这里面就涉及到了一个问题,就是软件开源了程序员吃饭怎么办?他人拿着代码改改就用不就完事了么?

软件开源,那么将会是,任何使用该开源软件的产品也必须100%开源,并且不能将其利用到任何商业目的中去。 如果你要违反,那么你除非事先和开源者签订交易协议,

不然可能会面临官司,和高额赔偿。

这样一想软件开源可能会更好,但是就目前来说的话,想要完全实现软件开源依旧任重道远。

还有一个问题:如果别人软件不开源,那么怎么知道他是否用了开源的内容呢?(留待以后慢慢了解吧,如果有想法的可以留言哦~ 我会虚心学习的)


进入正题——git的学习


对于git的学习,我是在网上看教程学习的,网址贴出来~http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

刚刚看这个教程的时候我就被这个世界上最先进的版本控制系统给吸引了,然后又对git的创始人liuns进行了一番评价,就完全激起了我对git的学习兴趣,硬是看完教程才舍得去吃晚饭~ 下面只是我对git学习的一些笔记,想要从头学习git的可以点击上面的传送门。下面的命令是参考上述文章中的命令。


一、安装get之后的简单配置

$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"

 上面可以配置你的个人信息。

$ git config --global color.ui true
开启所有的显示颜色,可以让关键信息显示不同的颜色。

二、新建一个版本库

$ mkdir gitproject$ cd learngit$ git init$ git add readme.txt$ git commit -m "wrote a readme file"

git init 会创建一个.git文件,这个就是git仓库,很重要。

三、本地版本控制

$ git status<span style="white-space:pre"></span>//查看目前仓库的状态(哪些文件没有add,哪些文件没有commit,哪些文件进行了修改)$ git diff readme.txt <span style="white-space:pre"></span>//查看文件发生了哪些变化$ git log<span style="white-space:pre"></span>//历史版本记录$ git log --pretty=oneline<span style="white-space:pre"></span>//历史版本记录单行显示$ git reset --hard HEAD^<span style="white-space:pre"></span>//回退一个版本$ cat readme.txt<span style="white-space:pre"></span>//查看cat中的内容$ git reset --hard 3628164<span style="white-space:pre"></span>//回退到指定版本$ git reflog<span style="white-space:pre"></span>//查看每条命令

对于git的版本控制原理:



HEAD指向的是当前节点,也就是说HEAD^指向前一节点,前两个节点就是HEAD^^或者HEAD~2,以此类推。

git之所以效率这么高,那就是因为它的很多操作都只是对指针进行操作,再大的数据变化,移动一个指针也就实现了。


$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

$ git reset HEAD readme.txt
将该文件回滚到HEAD指向的版本,可以清除暂存区的内容。

$ git rm test.txt$ git checkout -- test.txt
删除文件

删错了恢复到上一个版本(和上文撤销工作区一致)

四、远程仓库

1.$ ssh-keygen -t rsa -C "youremail@example.com"
先在本机上生成一个密钥对,id_rsa.pub公钥,id_rsa私钥。

2.登陆GitHub 打开setting,然后进入SSH Keys 将自己的公钥复制进去,这是在自己的gethub中添加信任电脑。只有添加了的电脑才能往该GITHUB上推送。

3.在GITHUB上Creat a new repo,然后自己取一个名字,来建立一个新的Git仓库。然后他会告诉你这个Git仓库的位置

4远程库关联

$ git remote add origin git@github.com:michaelliao/learngit.git$ git push -u origin master$ git push origin master

上面:后可以复制创建仓库后输出的位置后面部分。

第一次推送,需要加上-u 参数,这样不断把本地的master分支推送,还会把本地的master和远程的master关联起来,注意,这里只会推送master分支。

6.远程库克隆

$ git clone git@github.com:michaelliao/gitskills.git

多人开发的话,每人克隆一份就可以了。

五、分支管理

$ git checkout -b dev//创建分支,并且切换分支$ git branch dev//创建分支$ git checkout dev//切换分支$ git branch<span style="white-space:pre"></span>//查看分支$ git checkout master<span style="white-space:pre"></span>//切换到master分支$ git merge dev<span style="white-space:pre"></span>//合并分支$ git branch -d dev<span style="white-space:pre"></span>//删除分支$ git branch -D dev<span style="white-space:pre"></span>//强制删除分支

合并时冲突——当在两条分支上对同一文件进行了改动后,合并这两条分支时就会出现冲突,这时候需要打开文件手动修改后,再提交。

分支管理策略——在分支合并时,Git会使用Fast forward模式,在这个模式下会丢失分支合并信息,只保留主枝信息。
$ git merge --no-ff -m "merge with no-ff" dev//禁用FF模式,保留分支信息
$ git log --graph --pretty=oneline --abbrev-commit //查看分支历史

$ git stash<span style="white-space:pre"></span>//将当前工作区压栈$ git stash pop<span style="white-space:pre"></span>//将当前工作区出栈$ git stash apply<span style="white-space:pre"></span>//恢复工作区,但是不删除栈内工作区$ git stash drop<span style="white-space:pre"></span>//丢弃最上层栈内工作区$ git stash list<span style="white-space:pre"></span>//查看工作区栈

bug修复策略——保存当前工作区,新建一个分支,然后切换到分支,修改完,切换回master,然后合并,最后删除分支,恢复工作区。

多人协作

$ git remote//查看远程库的信息
$ git remote -v//显示更详细的信息

$ git clone git@github.com:michealliao/learngit.git
克隆的时候,在默认情况下,只会克隆master分支

这时候需要创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev

$ git push origin dev//将分支推送到远程


如果当别人已经想dev推送他的提交,碰巧你也对同样的文件进行了修改,那么就会造成冲突,这时候解决冲突的办法为:
将最新的提交抓下来,在本地合并,再推送。

$ git pull//先抓取
$ git branch --set-upstream dev origin/dev//如果抓取失败,则是未绑定,绑定
$ git pull//再进行抓取

抓取之后,需要手动解决冲突,然后再提交,再push。

综上,多人协作的工作模式是这样的:

1 先试图用 git push origin branch-name 推送自己的修改
2 如果推送失败,则用git pull试图合并
3 如果合并冲突,则在本地解决冲突,并提交
4 解决冲突之后,再进行推送就能成功

提示:如果git pull提示,no tracking information 则说明本地分支和远程分支的链接没有创建,用命令git branch --set -upstream branch-name origin/branch-name.

六、标签管理(标签就是指向某个commit的指针)

$ git tag v1.0//打上标签
$ git tag//查看标签
$ git tag v1.0 6224937//为特定的版本打上标签
$ git show tagname//查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" 3629172//创建带有说明的标签
$ git push origin v1.0//推送一个本地标签
$ git push origin --tags//推送未推送过的所有标签
$ git tag -d v0.9//删除一个标签
$ git push origin :refs/tags/v0.9//在本地删除之后,删除远程标签


七、自定义git

创建.gitignore文件,然后在里面写上需要忽视的文件名,然后提交,之后git将会忽视这些文件。还可以对.gitignore做版本管理!

$git config --global alias.XXX "xxxxxxx"
XXX为自定义命令,xxxxxxx为需要替换的命令。
如果加上--global是正对当前用户起作用,不加就只正对当前仓库起作用。
每个仓库的配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名就直接把对应行删除就好了。
当前用户的git配置放在【用户主目录】下的一个隐藏文件.gitconfig中。
【如果改错了,可以删掉文件,重新通过命令配置】


如何参与别人的开源项目?
1.访问它的主页,然后点Fork,这样就在自己的账号下克隆了一个该项目仓库
2.从自己的账号下clone
注意,一定要从自己的账号下克隆,不然是没有权限的。
3.当你改完之后,可以发起一个pull request,但是对方是否接受就不一定了。


如何搭建git服务器,目前并没有用到的可能,就先不做总结,这里留一个链接:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000

0 0