能有这篇笔记最大的原因是看了廖雪峰的网站,上面对git介绍的很详细,很系统
在我网上漫无目的的用百度搜索“git 命令“看的晕头之后,李阳同学给我推荐了这个网站,看着看着我就哭了(差一点~)
能花这么多的精力来写教程,实在让人感动
现在把学习过程中写的笔记搬过来,防止把笔记扔到什么地方再也找不到
git介绍
svn是开源的免费的集中式版本控制系统
git是开源的免费的分布式版本控制系统
svn有一个服务器作为中央服务器,所有人都把代码提交到中央服务器上面
git通常也有中央服务器,用来方便大家交换修改,但是,git的理念是,每个人手里的版本都是完整的,都可以进行版本控制
如果svn的中央服务器挂了,那么所有人都没有办法干活了,然而,如果git的中央服务器挂了,其中一个人的版本可以直接作为中央服务器来使用,因为他的版本保存着历史版本
所以有人说git就是客户端加服务器,我觉得挺有道理
而且git似乎没有权限设置,只要有账号就可以使用全部功能,比较适合开源的合作项目,如果需要权限管理,需要自定义
2018.8.2 自从我用了gitlab,git的权限管理其实不输svn啊,我之前太天真了
2019.8.26 https://www.git-scm.com/book/zh 这个地址貌似是git官方的教程,感觉比廖雪峰的更详细,可以深入学习一下
git是对文件的版本管理,它管理是一个文件夹下的所有文件,所以如果大多数命令都是在需要管理的文件夹下执行的
如果你要对一个Project文件夹和它下面的所有文件用git进行管理,那就要先cd到project文件夹,然后执行git命令
查看是否安装了git
在控制台中输入
git status
如果出现 fatal: Not a git repository (or any of the parent directories): .git,那就是没有使用git
将一个文件夹使用git进行管理
新建一个文件夹,然后在控制台中找到那个文件夹,在其中输入git init 命令,就会在这个目录下初始化一个git repository
cd /Users/chebao/Desktop/TestGit
git init
成功了之后会显示 Initialized empty Git repository in /Users/chebao/Desktop/TestGit/.git/
提交文件或修改 add commit
先使用add命令将文件添加到repository中,然后再使用commit命令来将文件提交到仓库
按照svn的逻辑,add是添加新文件,而commit是将文件中的改动添加到repository中
但是,git不是这样运行的
git分为工作区,暂存区和版本库
我们的修改都在工作区,而repository中有一个工作区和branch
当我们在执行add命令的时候,是把修改提交到了暂存区,当我们commit的时候,我们就把暂存区的文件提交到了branch中
所以需要两步,可是据我所知svn只需要一步commit,呵呵呵,这是为什么呢
这是因为git跟踪的是修改而不是文件
当使用svn的时候,提交是按照文件单位来提交的,而git可以只add一次修改,然后写了一会儿之后,再add一下也可以,之后commit的只是你add的内容,而不是当前文件的所有内容
相对来说貌似更细致了?
如果我修改了一个README.md的文件,我需要
git add README.md
git commit -m "修改了README.md文件"
add两个文件
git add file1 file2
在修改了多个文件的时候,可以一次性全部add
git add .
commit 后面的-m 标志后面是本次提交的说明 m应该是modify的意思
git的commit id不是1,2,3...递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,是为了多人使用时不至于冲突
add两个文件 $ git add file1 file2
查看改动过的文件 $ git diff
查看我们做的修改
绿色的部分是我们修改的部分
可以看到我们在 this is a new file这句话下面添加一个空白行,和add some code这句话
在确定代码没有什么问题之后,将代码进行 add 和 commit
一般来说提交之后最好使用 git status命令来看看有没有遗漏提交的代码
查看日志 $ git log
查看单行 $ git log --prety = online
回到上个版本 $ git reset --hard HEAD^
回到某个版本 $ git reset --hard 23333
HEAD表示当前版本,HEAD^表示上一个版本,上上一个版本是HEAD^^,往上100个版本写作HEAD~100
其中,23333是版本的标识符
将某个文件的修改全部清除 $ git checkout -- file1
将添加到缓存区的修改全部删除掉 $ git reset HEAD
缓存区会清零,工作区的文件不会有影响
删除文件 $ git rm file1
将本次仓库与远程仓库关联 $ git remote add origin https://********
当我们在本地创建了一个仓库之后,可以使用gitHub来远程管理自己的代码
在gitHub上面创建一个repository之后,就会给出一个http地址,然后使用remote命令来关联远程仓库,然后使用push命令来将本地仓库的所有文件推送到远程master库中,第一次push 的时候要加上 -u 参数,之后的修改可以不加
直接克隆远程仓库 $ git clone https://***
如果想要移除与远程仓库的关联
git remote rm origin
获取远程仓库分支的更新
Git fetch origin master git log -p master..origin/master git merge origin/master
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
另一种方法
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并结束
将本地分支推送到远程仓库的某一个分支
git push -u origin [name]
在开发的过程中,如果已经在dev分支开发完成了,就需要将分支中的代码合并到本地的master分支上去,然后将maser分支推送到远程仓库的master上面
除了这个步骤,为了保存开发代码,还需要将本地的dev分支推送到远程仓库中的dev分支上
我们需要先在本地切换到dev分支,然后执行上面的命令,意思是将当前分支推送到远程origin仓库中的某一个分支上,name就是远程的分支名
branch
这个东西是为了让你在开发自己的部分的代码的时候可以更好的进行代码管理
当你写的代码还是半成品但是你又想使用版本控制系统的时候,你可以创建一个自己的branch,然后在这个branch上面来开发,同样可以实现版本控制,等开发完成之后,再与主branch进行合并就好了
关键的命令:
查看分支:git branch 当前分支会标一个*
创建分之:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
亲测没有问题
如何解决冲突:将冲突的文件找到,编辑至可以正常运行,然后提交
查看合并路线图 $ git log --graph
取消Fast forward 模式 :$ git merge --no-ff -m "message" branchName
使用merge合并分支的时候,git 可能会启动Fast forward模式,将master指针直接指到HEAD的地方,这种方式不会产生commit,这样在删除分支之后,就看不到分支信息
在feature1 commit 和 conflict fixed 之间是有一个merge动作的,但是这里并没有显示,就是因为没有产生commit的原因
所以,在合并分支的时候,加上参数 —no-ff 参数 和-m参数来添加一个commit
在开发中,master分支是用来发布新产品的,dev分支是用来开发的,大家每个人都有自己的分支,写的代码都合并到dev上面,最后,在将要发布产品的时候,将dev合并到master上面就可以了
隐藏工作现场:$ git stash
stash命令
这样就把工作现场隐藏起来了,所有文件的内容看起来和库中的内容一样,而且status中是干净的
git stash list 命令
查看被隐藏的工作现场
git stash apply 恢复工作现场,但是不删除stash,在stash list中仍然可以看到
git stash drop 删除stash
git stash pop 恢复工作现场,同时把stash也删除
强行删除分支 $ git branch -D <branch name>
当需要开发一个新功能的时候,就需要新建一个分支,然后在开发完毕,和主分支合并了之后删除分支
$ git branch -d <branch name>
但是如果分支还没有合并就删除的话就会产生error,提示分支还没有合并
如果想要强行删除,就把d换成D
$ git branch -D <branch name>
查看远程库信息 $ git remote
当本地库与远程库相连的时候,本地库是master,远程库是origin
查看远程库信息
$ git remote
显示远程库详细信息
$ git remote -v
fetch是抓取地址,push是推送地址,如果没有推送权限,就看不到push信息
将本地分支所有修改推送到远程origin分支上面 $ git push origin master
将本地dev分支推送到远程origin分支
$ git push origin dev
如果推送失败,一般是因为没有抓取origin上面更新的文件,使用pull命令还抓取
$git pull
如果pull失败,可能是因为没有建立本地这个branch与origin的连接,按照提示可能需要branch命令
$git branch
如果git pull 提示“no tracking information”,则说明本地分支和远程分支的连接没有创建
用命令git branch —set-upstream branch-name origin/branch-name
建立本地分支和远程分支的关联,使用git branch —set-upstream branch-name origin/branch-name
打tag : $ git tag 0.1
git的tag也是一个指针,指向一个commit,和分支的指针不同,tag的指针是固定不动的,所以,创建tag和删除tag都是瞬间完成的
切换到你需要打tag的分支上,然后输入
$ git tag <name>
就可以了
例如 $ git tag 0.1
查看所有tag
$ git tag
想要在之前的commit上面打tag,只需要找到之前的commit代号,然后在写在名字后面
$ git tag 0.1 233333
查看tag信息
$ git show <tagname>
在打tag的时候添加说明
$ git tag -a 0.1 -m “this is the 0.1 version !” 2333333
删除tag
$ git tag -d 0.1
推送某个tag到远程
$ git push origin <tagname>
推送所有tag到远程
$ git push origin —tags
删除远程tag,需要先删除本地tag,然后再删除远程的
$ git tag -d 0.1
$ git push origin :refs/tag/0.1
使用gitHub参与修改别人的项目
点击进去别人的项目,然后点击fork
然后你的gitHub中就会出现这个项目
然后将这个项目克隆到本地,然后修改之后push到origin,然后点击在自己的github上的项目页面点击New pull request 按钮
填写相应信息之后就可以了
自定义Git
这个是在进行commit的时候需要的,本台电脑上所有的git使用的都一样
$ git config —global user.name “your name”
$ git config —global user.email “your email”
这个主要是为了让github或者其他git仓库进行身份识别,好进行一些其他的操作
让git显示颜色
$ git config —global color.ui true
配置忽略文件
创建一个.gitignore文件,然后里面写上需要忽略的文件,保存之后commit
配置别名
使用st代替status
$ git config —global alias.st status
—global 是全局参数,也就是这些命令在这台电脑的所有git仓库下都有用,如果不加这个参数,那就只针对当前的仓库起作用
关于ssh密钥
关联远程仓库可以使用http的链接,然后输入帐号密码来确认身份,也可以使用ssh key来确认身份
如果使用ssh,就需要本地生成ssh公钥和私钥,将公钥上传到远程仓库所属平台,就可以了
本地生成公钥和私钥
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接上传
如果没有,使用下面命令生成,邮箱写自己常用邮箱就可以
ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对
id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。