三剑客课程笔记"/>
GIT三剑客课程笔记
目录
建git仓库
把已有项目纳入git管理
新建的项目直接用git管理
创建变更
文件重命名
git版本日志
图形化查看版本历史
.git目录
commit,tree,blob三个对象之间的关系
分离头指针(detach head)
新建分支情况下,HEAD与branch以及HEAD的更多
删除不需要的分支
修改最新一次commit的message
修改老旧commit的message
怎么把连续的多个commit整理成1个
怎么把间隔的多个commit整理成一个
暂存区和HEAD的文件作比较
工作区和暂存区的文件比较
如何让暂存区恢复成和HEAD一样(就是放弃暂存区内容)
如何让工作区文件恢复为和暂存区一样
怎样取消暂存区部分文件的更改(部分文件恢复到和HEAD一样)
消除最近的几次提交(回退)
查看不同提交的指定文件的差异
正确删除文件的方法
开发中临时加了紧急任务怎么处理
如何指定不需要git管理的文件
git仓库备份到本地
不同人修改了不同文件如何处理
不同人修改了同文件的不同区域如何处理
不同人修改了同文件的相同区域如何处理
同时变更了文件名和文件内容如何处理
把同一文件变成了不同的文件名如何处理
集成使用禁忌
github高效搜索
开发的工作流模式
查看git版本
打开git bash,输入git --version
最小配置
配置user
配置user.name和user.email
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain'
git config --local
git config --global
git config --system
git config --list --local(如上三个一致的--local等)(查看相关配置)
建git仓库
把已有项目纳入git管理
cd 项目代码所在文件夹
git init
新建的项目直接用git管理
cd 某个文件夹
git init your_project(会在当前路径下创建和项目名称同名的文件夹)
cd your_project
创建变更
将新文件纳入git管理(加入暂存区)
git add xxx
将已经被git管理过的文件,提交到暂存区(-u是update的意思)
git add -u
查看状态
git status
提交变更(暂存区的变化,提交到版本管理)(工作区直接提交到版本管理的话用的是-am)
git commit -m'ADD someting or babababa‘
查看git日志
git log
文件重命名
git mv readme readme.md
git commit -m'rename'
git版本日志
日志查询哪一次变更了什么东西
git log --oneline (--all)(--graph)(-n4(所有分支的最近四个,结果只有四个记录))
查询最近4次变更了什么
git log -n4 --oneline
查看当前是哪个分支
git branch -v
创建分支temp
git checkout -b temp xxxxxxxx
基于xxx分支创建aaa分支
git checkout -b aaa xxx
比较两个commit的不同·
git diff commitid1 commitid2
git diff HEAD HEAD^^(比较当前分支和他父亲的父亲的分支)
git diff HEAD HEAD~2(同上)
git log(当前分支的版本历史)
git log --all (--graph)(全部分支)
查看temp分支的日志
git log --oneline temp
图形化查看版本历史
gitk
.git目录
cat .git/HEAD 查看当前使用的分支
cat .git/config 一系列配置,包括用户名,邮箱等
ref引用目录,存放分支,tag等。
.git/ref/heads/master或者temp
git cat-file -t xxxxxx(是master或者temp等的hash值代表的类型)
查看xxxxx对应信息(blob,tree,commit,tag(指向commit类型等)等)
git cat-file -p xxxxxx
查看xxxxx对应内容
objects,里面有各种blob,只要内容相同,就是一个blob
commit,tree,blob三个对象之间的关系
一个commit只能对应一个tree(某种程度上相当于一个文件夹),通过tree呈现出来的在对应的时间点,这个commit对应的所有文件的信息的快照。
blob只与文件的内容有关,和文件的名字无关。
分离头指针(detach head)
就是在当前无分支的状态下进行开发,一旦切换到其他分支,代码容易被git当作垃圾给处理掉,并且如果checkout到了其他分支,新增的改动也会被丢弃。
当将处于分离头指针的状态下的代码直接提交的时候,git log,会显示
commit: kehdkajdhcksdjbcksdjbckedhks(HEAD)
但是这种时候的commit,既没有和分支绑定,也没有和tag绑定,使用gitk --all进行查看的时候,是找不到的,也就是说,git认为这种提交是不重要,日后是会被清除的。
可以直接使用git branch xxx kehdkajdh命令,将commit:kehdkajdh和分支xxx绑定在一起。
新建分支情况下,HEAD与branch以及HEAD的更多
当使用指令,基于分支xxx创建分支aaa时
git checkout -b aaa xxx
执行git log -n1,发现HEAD发生了变化,显示如下
commit ajdhbckhbckdsj (HEAD -> aaa,xxx)
cat ./git/HEAD
refs/heads/aaa
(HEAD指代新分支的最后一次提交,或者是分离头指针中的一个commit,但是实际上,都是指向一个commit,因为如上的aaa的类型,就是commit
(cat .git/refs/heads/aaa 显示ajdhbckhbck,
git cat-file -t ajdhbckhbck,显示commit))
当做了分支切换时,HEAD也会变成指向新分支。
删除不需要的分支
git branch -d 分支名(显示删不掉,not fully merged)
git branch -D 分支名(删了)
修改最新一次commit的message
git commit -amend,然后直接在界面修改
修改老旧commit的message
git rebase -i {老旧commitid}
之后进入一个界面,根据下面注释给出的信息,选择对应commit的那一行,pick改成r,之后保持。
之后会进入另一个界面,在这个界面修改message信息,之后再保存。
(rebase用到了分离头指针)
怎么把连续的多个commit整理成1个
git rebase -i 一个不属于要合并的commit的id (进入界面)
将要合并的commit(除第一个)的前面的pick改成s(squash)(然后保存,进入新界面)
在新界面上写合并的原因,再保存
怎么把间隔的多个commit整理成一个
git rebase -i
进入界面,将想要合并的commit放在一起,后几个commit(除第一个)使用s(squash),保存
在新界面上写合并原因,保存
暂存区和HEAD的文件作比较
git diff --cached
工作区和暂存区的文件比较
git diff
git diff -- readm123(只呈现文件readm123的差异)
git diff -- read1 read2 read3(呈现这三个文件的差异)
如何让暂存区恢复成和HEAD一样(就是放弃暂存区内容)
git reset HEAD
如何让工作区文件恢复为和暂存区一样
git checkout -- filename
怎样取消暂存区部分文件的更改(部分文件恢复到和HEAD一样)
git reset HEAD -- filename1 filename2 filename3
消除最近的几次提交(回退)
git reset --hard commitid(暂存区和工作区都回退到这个commit)(回退的几次变更的东西会丢失,慎用)
查看不同提交的指定文件的差异
git diff branch1/commit1 branch2/commit2 -- filename1 filename2
正确删除文件的方法
git rm filename(工作区的文件被删除?)
开发中临时加了紧急任务怎么处理
对应的分支有bug,要临时加东西。
需要先把手头的工作存起来,等到将bug修复,生成新的commit提交之后,在继续做之前的工作。
git stash(将当前手头的工作先存放,相当于一个堆栈)
git stash list(查看)
git stash apply (弹出堆栈顶部的内容放到工作区去,并且执行git stash list,发现内容还在,可以反复使用)
git stash pop (弹出堆栈顶部的内容放到工作区去,并且执行git stash list,内容不在,会被删除)
如何指定不需要git管理的文件
(在github里面是.gitignore里面的)
但是如果将文件加到了暂存区,gitignore就没有作用了。
vi .gitignore(加入文件,文件夹)
mkdir doc
doc 加入,屏蔽了doc
doc/加入,屏蔽了doc文件夹(不管doc文件夹下面的东西,doc这个文件还是会管的)
如果是doc.gitignore,git不会识别这个文件。
git仓库备份到本地
git clone --bare /user/.................../.git ya.git(哑协议)
git clone --bare file:///user/................../.git zhineng.git(智能协议)(存储打包,压缩)
git remote add zhineng file:///user/.................../zhineng.git
git push --set-upstream zhineng 12345branch(?)
案例操作:
git remote github git@github:xxxx/git_learning.git
(git remote github不生效时,用git remote add origin)
git remote -v
git push github --all
(git pull(等于先fetch再merge))
git fetch github master
gitk --all
(解决不是fast forward的问题(不是基于远端分支开发),1 rebase,2 merge)
git branch -av(列出本地和远端的分支)
git merge --allow-unrelated-histories github/master(将当前分支与远端的这个分支合并,--allow-unrelated-histories参数表示允许两个分支在历史上没有关联)
(rebase之后,只有一个父commit。merge之后有两个,一个是本地master,一个是远端master)
不同人修改了不同文件如何处理
git fetch github(防止不是fast forward)
git merge github/feature/add_git_commands
git push github
不同人修改了同文件的不同区域如何处理
fetch,push
git自动merge,相同区域需要人为介入
不同人修改了同文件的相同区域如何处理
git pull(拉取远端文件,然后merge,不过会报错,因为文件内容有冲突)
vi 有冲突的文件
若想都保留,就直接把
<<<<<<<<<<<<<<<<,HEAD
====================
>>>>>>>>>>>>>>>>>>>SKDGKAJSBKAJSBX
都删除掉,留下之间的两部分内容。
然后git status
之后可以根据git的提示
想合并:git commit
不合并:git merge --abort(恢复之前的状态)
之后git push github
同时变更了文件名和文件内容如何处理
git pull自动将更新的文件名,对本地旧文件的文件名更新,并自动进行合并。
把同一文件变成了不同的文件名如何处理
这个时候使用git pull,会在本地留有对于这个原本的那个文件的两个文件,并且报冲突。
git status
git add xxx1
git status
git rm xxx2
git commit
git push
(删除一个,提交一个)
集成使用禁忌
git push -f(不是fast forward也能push上去)
例子:
git reset --hard xxxx 再加上 git push -f
可以让界面上显示的以往各个commit记录都消失,以前的各种commit,添加的很多功能可能就会没有了。
公共分支严禁拉到本地做rebase变基。会让后续的子分支,不是fast forward。后续的子分支就只能也手动rebase,或许会一个个commit去改进,非常麻烦。
github高效搜索
在readme里进行搜索
搜索框里输入:
xxx akejdh ooo in:readme stars:>1000
(其余详细的看github的help)
开发的工作流模式
就是选用合适的开发分支模型
主干开发
git flow
github flow
gitlab flow
更多推荐
GIT三剑客课程笔记
发布评论