前言:这个版本同样是我再次看了廖雪峰老师的教程又总结的笔记。如果只是简单实用,可以直接跳转到简单版笔记。https://blog.csdn.net/m0_47812755/article/details/107066584 上手操作简单多了。
Git笔记
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Linus(人名)创建Linux
时,由于后期代码库太大,Linus无法手工管理。当时的版本控制系统要收费,不符合Linux
开源的理念。(中间省略BitMover公司收回BitKeeper免费试用权。)之后Linus花了两周时间自己用C
写了一个分布式版本控制系统,这就是Git!
一、集中式vs分布式
集中式:
- 版本库是集中存放在中央服务器的。
- 中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
- 必须联网才能工作,受网速影响。
分布式:
- 没有“中央服务器”。不需要联网。
- 安全性高。因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
- 分布式版本控制系统通常也有一台充当“中央服务器”的电脑,这个服务器的作用仅仅是用来方便“交换”大家的修改。
二、安装
Linux直接 apt-get install git 就可以。
Windows从Git官网下载https://git-scm.com/downloads。
安装完成后:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置。
三、创建
- 首先,找到一个合适的位置,创建空文件夹。最好不使用中文命名。
- 通过
git init
命令把这个目录变成Git可以管理的仓库。
git init
会生成.git
文件夹,这个文件夹是Git来跟踪管理版本库的。勿动!
ls -ah -- 这个目录默认是隐藏,用ls -ah命令就可以看见。
1.基础命令
git init
初始化 把这个目录变成Git可以管理的仓库
git add
添加文件
git commit -m
提交到仓库-m是提交的说明。
git status
查看状态
git push
推送到远端
git add xxx
git commit -m 'xxx'
git diff xxx
2.修改
git diff
查看修改详情
3.查看修改记录日志
git log
显示从最近到最远的提交日志
如果嫌输出信息太多,可以加上--pretty=oneline
参数。
git log --pretty=oneline
4.版本回退
首先确定回退版本。HEAD
是版本号: 1094adb...
git reset --hard commit_id
版本回退。git log
查看提交历史git reflog
查看命令历史
git reset --hard HEAD^
- 版本号没必要写全,前几位就可以了。可以tab补全。
- 如果已经回退到旧版本,但是后悔了。可以用新版本的
commit ID
来reset
。 - 如果记录找不到commit ID 了 ,可以使用
git reflog
查看历史使用过的命令。
四、工作区和暂存区
工作区
电脑中确定存放代码的文件夹就是工作区。
版本库
隐藏目录.git
是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
暂存区
git add
把文件添加进去,就是把文件修改添加到暂存区。
git commit
就是把暂存区的所有内容提交到当前分支。
git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
五、撤销修改
git checkout -- file
可以丢弃工作区的修改。把文件在工作区的修改全部撤销。
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
六、删除
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
git rm xxx
删除文件
七、远程仓库
创建好github仓库。第一次使用github需要添加ssh秘钥。
关联一个远程库:git remote add origin git@server-name:path/repo-name.git
git push -u origin master
第一次推送master分支的所有内容
本地提交后,就可以使用命令git push origin master
推送最新修改
个人感觉还是git clone方便一点。可能廖雪峰老师的git教程比较老了,他的方法可能会出现一些别的问题。可以参考之前的笔记:
https://blog.csdn.net/m0_47812755/article/details/107066584 没有介绍很详细,但是操作起来会很简单。
八、分支
创建分支
git branch (branchname)
切换分支
git checkout (branchname)
合并分支
git merge
--no-ff
用于合并指定分支到当前分支。
git merge --no-ff -m "merge with no-ff" dev -- 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
- 禁用
Fast forward
模式,加上--no-ff
参数就可以用普通模式合并。 - 默认情况下Git会用
Fast forward
模式,这种模式下,删除分支后,会丢掉分支信息。 - 当Git无法自动合并分支时,就必须首先解决冲突(手动解决)。解决冲突后,再提交。
例子: git merge test 合并完后就可以删除分支:
列出分支
git branch
没有参数时,git branch 会列出你在本地的分支。 当前分支前面会标一个*
号。
分支合并图
git log --graph
命令可以看到分支合并图。
创建新分支并立即切换到该分支下
git checkout -b (branchname)
删除分支
git branch -d (branchname)
如果是未合并的分支,删除时会提示。
可以通过git branch -D <name>
强行删除分支。
switch
创建并切换到新的分支
git switch -c dev
直接切换到已有的master
分支
git switch master
分支命令小结(全)
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
Bug分支
修复bug时,手头还有工作没做完,但需要先修复bug。先git stash
保存一下,切到主分支。从主分支创建新的分支,解决完bug和主分支合并。删除掉bug分支,切回之前的工作。
git stash list
找到之前保存的工作,再git stash pop
,回到工作现场。
因为bug是主分支之前产生的,我们手头正在工作的分支也是从产生bug的主分支切出来的,所以需要把手头工作的分支上的bug也解决一下。
git cherry-pick <commit>
找到主分支解决bug后的commit编号,当前分支用git cherry-pick 这个命令复制一个特定的提交。手头工作分支的bug也就解决了。
多人协作
git remote origin
查看远程库的信息。远程仓库的默认名称是origin
。
git remote -v
显示更详细的信息。
下面的实例如果没看懂,跳转到原教程网页看一遍详细的案例:https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
变基
git rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
九、标签
1.作用
为了方便找到commit。因为commit编号不好记,可以通过添加tag
更容易找到想要的commit。
2.创建标签
切换到需要打标签的分支上,git tag <name>
就可以打一个新标签。默认标签是打在最新提交的commit上的。
git tag
查看所有标签。
git tag v0.9 f52c633
找到对应的commit ID 也可以加标签。
git show <tagname>
查看标签信息。
git tag -a v0.1 -m "version 0.1 released" 1094adb
用 -a
指定标签名,-m
指定说明文字。
3.操作标签
git tag -d v0.1
删除标签。
git push origin <tagname>
推送某个标签到远程。
git push origin --tags
一次性推送全部尚未推送到远程的本地标签。
推送到远程的标签,需要先删除本地标签,git tag -d v0.9
,然后再删除远程标签。git push origin :refs/tags/v0.9 To github.com:michaelliao/learngit.git
github地址换成自己的。
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
十、忽略特殊文件
不需要从头写.gitignore
文件,所有配置文件可以直接在线浏览:https://github.com/github/gitignore组合一下就可以使用。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
git check-ignore
检查.gitignore文件。
十一、搭建Git服务器
因为大概率用不到,所以这章没看。https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664用到再看。