Git 学习笔记
1、创建当前文件夹路径为git仓库: git init
2、添加文件进行管理(可以一次性添加多个文件): git add 文件全名
例如: git add file1.txt file2.txt
3、添加文件到软件仓库的说明: git commit -m“文件说明”
例如: git commit -m‘wrote a new file’
4、查看当前仓库状态: git status
5、查看文件修改的内容: git diff 文件名
例如: git diff readme.txt
6、版本返回
a. 查看所有版本: git log
如果嫌输出信息太多使用:git log --pretty=oneline
b. 返回版本之前,首先我们必须知道当前版本是哪个版本然后退回上一个版本:git reset --hardHEAD^
查看文件内容: cat 文件 例如:cat readme.txt
回到当前版本的未来版本:git reset --hard 系统版本号前几位
想退回到最新版本:git reflog 查看记录的每一条命令,查看到序列后再git reset --hard加系统版本号前几位
7、管理版本
丢弃工作区的修改: git checkout --文件名
8、删除文件: rm 文件名
9、远程仓库
连接远程仓库:
a、 登录github,探后在右上角找到“Create a new repo”按钮, 创建远程新的仓库
b 、在Repository name填入 仓库名 其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
c、我们根据GitHub的提示,在本地的新的刚刚创建的本地仓库下运行命令:git remote add origin git@github.com:账户名/仓库名.git
d、推送内容到远程仓库: git push -u origin master(-u参数第一次 推送时使用,后续不再使用、 master 是推送的当前分支master)
e、刷新页面就能在远程仓库看到和本地一样的内容。
f、 SSH警告:第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added ‘github.com’ (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
10、从远程仓库克隆
a、克隆一个本地库: git clone
例:git clone git@github.com:用户名/仓库名.git
b、进入 仓库名 目录查看,已经有 远程仓库名文件
例:cd 仓库目录 ls
11、分支管理
a、创建分支(如dev):git branch
b、切换分支: git checkout
c、查看当前分支: git branch
d、合并分支: git merge (git merge命令用于合并指定分支到当前分支,即合并 dev分支到当前的分支)
e、删除分支(dev):git branch -d
f、解决冲突 :当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log --graph命令可以看到分支合并图。
g、Bug分支:软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
o、储藏当前工作现场:git stash
p、查找储存工作现场: git stash list
q、恢复工作现场:工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
12、Feature分支(流程模拟)
软件开发中,总有无穷无尽的新的功能要不断添加进来。现在,你终于接到了一个新任务:开发代号为Vulcan的新功能,于是准备
开发:
git checkout -b feature-vulcan
开发完毕:
git add vulcan.py
git status # 这一步可以不要,该步骤为查看当前工作目录状态
git commit -m “add feature vulcan”
切回dev,准备合并:
git checkout dev
一切顺利的话,feature分支和bug分支是类似的,合并,然后删除。
但是!
就在此时,接到上级命令,因经费不足,新功能必须取消!
虽然白干了,但是这个包含机密资料的分支还是必须就地销毁:
git branch -d feature-vulcan
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修 改,如果要强行删除,需要使用大写的-D参数。。
现在我们强行删除:
git branch -D feature-vulcan
小结
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
13、多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
$ git remote
origin
或者,用git remote -v显示更详细的信息:
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
14、Rebase
git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
15、标签管理
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
a、创建标签
切换到需要打标签的分支上git branch
然后打标签 git tag v1.0。默认标签是打在最新提交的commit上的。
b、查看标签: git tag
c、打历史标签:
首先查找到所有历史提交的commot id :git log --pretty=oneline --abbrev-commit
然后命令: git tag v1.2 <id可以是前几位commit id>
d、还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m “version 0.1 released” 1094adb
e、git show 可以查看说明文字:
例如: git show v0.2
小结:
命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a -m "blablabla…"可以指定标签信息;
命令git tag可以查看所有标签。
16、操作标签
a、删除标签: git tag -d v0.1
b、推送某个标签到远程仓库: git push origin v1.0
或者推送全部标签到远程仓库: git push origin --tags
c、删除远程仓库:
1、先删除本地: git tag -d v0.9
2、再删除远程: git push origin:regs/tags/v0.9
**小结**
命令git push origin 可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d 可以删除一个本地标签;
命令git push origin :refs/tags/可以删除一个远程标签。
17、使用码云
使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的)。如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——码云(gitee.com)。
a、创建码云库省略
b、关联码云远程库:git remote add origin git@gitee.com:liaoxuefeng/learngit.git
18、自定义Git
a、颜色:git config --global color.ui true
b、忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files …,有强迫症的心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
检验.gitignore的标准是git status命令是不是说working directory clean。
a、如果被.gitignore忽略,可以使用: git add -f <文件> 强制添加到Git。
b、或者发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查: git check-ignore -v <文件名>。
Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
小结
忽略某些文件时,需要编写.gitignore;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
19、命令配置别名(没用过)
a、如给status配置别名st
git config --global alias.st status
b、配置文件
每个仓库的Git配置文件都放在.git/config文件中。
20、搭建Git服务器
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
第一步:安装git
sudo apt-get install git
第二步:创建git用户,用来运行git服务:
sudo adduser git
第三部:创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
第四步:初始化Git仓库:
先选定一个目录作为Git仓库(裸仓库),假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
然后把owner改为git:
sudo chown -R git:git sample.git
第五步:禁用shell登录:
通过编辑/etc/passwd文件完成
将:git❌1001:1001:,:/home/git:/bin/bash 改为:git❌1001:1001:,:/home/git:/usr/bin/git-shell
第六步:克隆远程仓库: git clone git@server:/srv/sample.git
第七部:管理公匙
第八步:管理权限