Git应用开发详解笔记
Git应用开发详解笔记
name与email配置
- 项目配置
配置文件位置:当前项目/.git/config(文件)
使用
git config --local user.name “name”,
git config --local user.email “email”
设置某项目的用户及邮箱
- 用户配置(一般使用该配置)
配置文件位置:~/.gitconfig(文件)
使用
git config --global user.name “name”,
git config --global user.email “email”
设置某用户目录的用户及邮箱
- 全局配置(整台机器,基本不使用)
配置文件位置:/etc/gitconfig(文件)
使用
git config --system user.name “name”,
git config --system user.email “email”
设置全局的用户及邮箱
-
相关命令
列出配置信息 git config --list
删除项目用户名 git config --local --unset user.name
删除项目邮箱名 git config --local --unset user.email
添加、删除、修改与日志
- 常用shell命令
touch a.txt 创建 a.txt 文件
echo “…” > a.txt 写入内容到文件a.txt(a.txt不存在,则自动创建)
echo “…” >> a.txt 在文件a.txt中追加内容
ls -ah 查看隐藏的文件
- git 仓库初始化
git init 初始化文件夹,使之变成 git 仓库,会生成 .git 隐藏文件
git add a.txt 把 a.txt 提交到暂存区,此时并未提交到仓库
git commit -m ‘xxxxx’ 提交到仓库,-m 后面是提交时的说明
git commit -am ‘xxxxx’ 上面两个操作的合并,前提是该文件必须已经 add 进了版本库
git commit --amend -m ‘xxxxx’ 修改上一次提交的 commit message
git add . 一次性提交所有文件,最好不要用 git add * (.gitignore中文件也会被加入到暂存区)
git status 查看当前状态
-
删除、移动与恢复(版本回退)
git rm a.txt:
a.txt 必须提交过,否则报错(因为如何a.txt未提交,则会永久删除无法恢复)
1、删除了一个文件
2、把删除文件这个操作纳入到暂存区
若想恢复文件,需要两步:
1、git reset HEAD a.txt 把文件从仓库恢复到暂存区
2、git checkout – a.txt 把文件从暂存区恢复到工作区(也即是将工作区的修改丢弃)
rm a.txt:
只是将文件删除,并未纳入到暂存区
若想恢复这个文件,需要执行 git checkout – a.txt 将工作区中的修改丢弃
若确定要删除这个文件,删除完之后,需要把删除这个操作 add 进暂存区,再 commit
git mv a.txt b.txt
重命名,相当于把 a.txt 删除,在新增 b.txt,并把这两个操作提交到暂存区
执行 git reset HEAD a.txt,git checkout – a.txt 会恢复 a.txt(相当于恢复 git rm a.txt)
执行 git reset HEAD b.txt b.txt 会变成未 add 的状态,需要手动删除 b.txt
最简单的恢复的方法是把 b.txt 重命名为 a.txt
git rm --cache a.txt
移除暂存区中的 a.txt,不对该文件进行跟踪
git checkout -- a.txt
丢弃工作区的修改,与暂存区保持一致(第一次 add 了,然后从当前到下一次 add 之前,本质就是把文件从暂存区恢复到工作区):比如把 a.txt add 之后,用 rm 删除 a.txt,删除之后可以用这个命令恢复
git reset HEAD a.txt
丢弃暂存区的修改,与仓库保持一致(前提是至少有一次 commit),本质就是从仓库恢复最近的一次提交的文件到暂存区(所以说至少有一次 commit)
git reset --hard commit_id **版本回退:**已经提交到仓库了怎么撤销呢,执行这个命令(HEAD 表示当前版本,HEAD^ 上一个版本,HEAD^ 上上个版本;HEAD~1 上一个版本,HEAD~2 上上个版本)
当回退到历史记录,还想再回到最后一次提交,此时已经看不到commit id,而 HEAD…只能往前回退,此时可以使用 git reflog 获取操作日志,在操作日志中拿到最后一个commit id,然后回到最后一次提交
- 日志
git log 查看所有产生的 commit 记录,按 q 推出
git reflog 显示所有历史命令,当你回退到之前的本版之后又想回退回来,但是 git log 已经没有你想要的 commit id 了,那就使用这个命令
git blame ‘file’ 列出文件由谁修改,修改内容、时间(blame – 归咎)
git config --global alias.br branch 设置简写(别名), 在文件 ~/.gitconfig 可以查看得到
查看远程分支的 log
git log origin/master
git log remotes/origin/master
git log refs/remotes/origin/master
git log -n 查看近 n 条的提交信息
git log --pretty=oneline 简短显示 commit 记录
git log --graph --pretty=oneline --abbrev-commit 查看分支合并情况(简要信息)
git log --graph 以图形化方式查看分支合并情况
git log --pretty=format:"%h - %an, %ar : %s" 以某种格式显示提交信息
git log -p 展开显示每次提交的内容差异
git log --stat 仅显示简要的增改行数统计
获取帮助
git config --help
git help config
man git-config
.gitignore
*.a 忽略所有.a结尾的文件
!lib.a 但lib.a除外
/TODO 仅仅忽略项目根目录下的TODO文件(目录,linux不区分文件与目录),但不包括sub/TODO
/*/TODO 忽略子目录下的TODO文件(目录,linux不区分文件与目录)
/**/TODO 忽略根目录下的TODO文件(目录,linux不区分文件与目录)
build/ 忽略build/目录下的所有文件(斜杠可不加,build在第几级目录无所谓)
doc/*.txt 忽略doc/notes.txt但不包括doc/server/arch.txt
doc/*/ *.txt 忽略所有子目录下的txt文件
doc/**/ *.txt 忽略doc目录下的所有txt文件
对于 已经添加暂存区 or 提交版本库 文件,添加到.gitignore后,要手动从暂存区删除,并提交版本库
git rm --cached 文件 删除暂存区文件
对于已经添加版本库推送到远程的文件,后来又加入到了 .gitignore,但是远程并不会删除该文件
git rm -r --cached . 删除暂存区所有的文件
git add .
git commit -m “xxx”
git push
结束
分支
- 常用命令
git branch 查看当前在哪个分支里,前面有个 * 号
git branch a 创建 a 分支
git checkout a 切换到 a 分支
git branch -m master master2 分支改名
git checkout -b a 创建并切换到 a 分支
git checkout commit_id 切换到某个历史提交点(此时处于游离的分支上的状态),在这个游离的分支上可以修改、提交、切换分支,切换之后会有如下提示:
执行 git branch commit_id 创建一个新的分支
git checkout origin/master
同上,切换到origin/master所指向的提交点,origin/master与远程同步,只有git push/pull/fetch可以改变
git branch -d a 删除 a 分支
git branch -D a 强制删除 a 分支,有些时候可能会删除失败,比如如果 a 分支的代码还没有合并到 master,你执行 git branch -d a 是删除不了的,它会智能的提示你 a 分支还有未合并的代码,但是如果你非要删除,那就执行 git branch -D a 就可以强制删除 a 分支
git push origin --delete dev 删除远程 dev 分支
git push origin :dev 删除远程 dev 分支
- 合并
git merge a 把 a 分支合并到当前分支,需要先切换到当前分支,然后再执行此操作
git merge --no-ff dev 合并时加上 --no-ff参数会禁用fast-forward, 这样会多出一个commit id
默认合并会丢掉合并分支信息(删除被合并分支,不知道这里是合并过来的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1QII8vX-1582708384813)(https://i.loli.net/2019/07/18/5d30232eefffb87216.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9MsdY9I-1582708384815)(https://i.loli.net/2019/07/18/5d3020a8256bd13076.png)]
如果 master 和 dev 分支修改了同一个地方:把 dev 合并到 master 上时,会出现冲突,需手动解决,解决之后,执行 git status 查看状态,需要 git add “file”,然后 git commit 就行
再回到 dev 分支上,此时 dev 分支上的内容一直没变过,但已经落后 master 一次了,需要把 master 分支合并到 dev,即在 dev 分支上执行 git merge master,会出现快进(fast-forward)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLr2jthR-1582708384816)(https://i.loli.net/2019/07/18/5d302125d5fdd57423.png)]
- 保存和恢复
git stash(存放) 把当前工作现场“储藏”起来,等以后恢复现场后继续工作(使用场景:在一个分支上开发,突然要切换到另一个分支上,而目前这个分支还没开发完,没法提交,但是不提交的话就无法切换分支,这时候可以用 git stash 暂存起来)
git stash save ‘hello’ save 后面可以加信息
git stash list 查看储藏起来的列表
git stash apply (只保存一个工作现场,多个的话需要加参数)恢复储藏的列表,恢复后,stash 内容并不删除
git stash drop (只保存一个工作现场,多个的话需要加参数)删除储藏起来的列表
git stash pop 合并上面两步操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbmrTDVE-1582708384818)(https://i.loli.net/2019/07/18/5d3021660900660984.png)]
git 标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqspYgFc-1582708384819)(https://i.loli.net/2019/07/18/5d30218b9058f39798.png)]
git show v1.0
显示标签内容
一个标签对应两个 id,一个是标签本身的 id,另一个是标签对应的分支提交点的 commit id
- 标签推送到远程:
git push origin v1.0
git push origin refs/tags/v1.0:refs/tags/v1.0 完整写法
git push origin v1.0 v2.0 v3.0 批量推送标签
git push origin --tags 一次性推送所有标签
- 只拉取标签
git fetch origin tag v1.0
- 删除远程标签:
git push origin :refs/tags/v1.0
git push origin --delete tag v1.0
比较不同
git diff 比较暂存区(a)与工作区(b)的区别,原文(a)是暂存区,目标(b)是工作区
文件 1.txt,新增一行 line one,git add . 然后再新增一行 line two,用 git diff 比较,分析如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1s0y7Lt-1582708384820)(https://i.loli.net/2020/02/16/TsqLvthBdN6RWcO.png)]
git diff HEAD 比较 HEAD(当前分支,最新提交)与工作区的区别,原文件是HEAD,目标文件是工作区
git diff --cached 比较HEAD(当前分支,最新提交)与暂存区的区别,原文件是HEAD,目标文件是暂存区最新内容
git diff 分支名 比较[分支名]与当前分支之间的区别
git diff commit_id 比较commit id与工作区之间的区别
远程
git remote show 与当前项目关联的所有的远程仓库(不止一个),一般是 origin
git remote show origin 远程仓库的详细信息(可以查看远程是不是有别人推送新的代码,推送前最后执行一下)
git branch -a 查看本地和远程所有分支
git branch -v 查看当前所处的分支的最新的提交信息
git branch -av 查看本地和远程所有分支及最新的提交信息
git branch -m oldname newname 更改分支名称
重命名远程分支:先删掉远程分支,重命名本地分支,把本地分支推送到远程
git remote rename origin origin2 重命名远程仓库
git remote rm origin 删除远程仓库
git remote add origin 仓库名 添加远程仓库
git pull = git fetch + git merge :
git fetch 从远程 master 拉取最新的到本地 origin/master,不会失败
git fetch origin 远程分支名:refs/remotes/origin/本地分支名 git fetch全写,远程分支名与本地分支名可以不同,但是一般设置相同,设置相同时可以简写
git merge origin/master 从本地 origin/master 合并到本地 master,可能会出现冲突(origin/master可有可无,默认就是origin/master)
两人修改了相同的地方,其中一个人先 push,另一个人一般是先拉取分支,如果这个人有文件没有 commit 的话,会提示先 commit,不然无法 pull,commit 之后,再 pull 的话,会提示有冲突,冲突内容已经写入到冲突文件中了,需要先解决冲突,完了之后 git add . 再 git commit(不加任何东西)会进入编辑模式,默认就行,此时,本地分支已经比远程分支多了两次提交,最后执行 git push 就行,这个人的文件就是最新的,先 push 的那个人需要 git pull 拉取最新的内容
- 把分支推送到远程
git push --set-upstream origin dev(等价于 git push -u origin dev)如果想把本地 dev 推送到远程的 dev2,就需要 git push --set-upstream origin dev:dev2,但是在执行 git push 的时候会报错,提示本地分支和远程分支不同名,解决办法:写全 git push 的命令,完整写法是 git push origin src:dst
,这里需要写成 git push origin HEAD:dev2(HEAD 指当前分支,也可以写成 dev),如果本地和远程分支同名,完整的写法是 git push origin dev,把远程分支省略掉了,进而更简洁的写法是 git push
- 把远程分支拉取到本地
把 dev 分支推送到远程,另一个人 git pull 的时候,会把 origin/dev 拉取下来,但是本地并没有 dev 分支,想要创建本地 dev 分支,需要执行
git branch dev origin/dev(等价于 git checkout --track origin/dev,在本地创建一个跟远程分支名字一样的分支,若想创建一个与远程分支名不一样,就用前面的)意思是创建一个追踪远程 dev 的本地 dev
一个人删除了一个远程分支,另一个人使用 git remote show origin 查看远程仓库的信息,会出现下面情况(本地 master,dev,test,远程master,dev,test,删除远程 dev)
要想删除本地对远程分支dev的引用,执行 git remote prune origin
(prune – 修剪、裁剪)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00vcf4lP-1582708384822)(https://i.loli.net/2019/07/18/5d30214b4f89d61303.png)]
refspec
git checkout -b dev origin/dev 基于本地的远程分支origin/dev创建本地的分支dev
git checkout --track /origin/dev 作用同上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTkk2ebp-1582708384824)(https://i.loli.net/2020/02/19/xq3WQsN6BpGfubr.png)]
git log origin/master
git log remotes/origin/master
git log refs/remotes/origin/master
子项目
submodule(不适合修改子项目代码)
git submodule add [email protected]… mymodule 本地新增子项目
进入到mymodule执行 git pull 更新子项目代码
git submodule foreach git pull 一次性更新所有子项目代码
拉取带有submodule的项目:
- 执行 git clone [email protected]… 目录名 命令,并不能把子项目中的代码拉下来,要想拉下来子项目代码,需要进入子项目目录,然后执行 git submodule init && git submodule update --recursive
- git clone [email protected]… 目录名 --recursive
删除子模块:
git rm --cached mymodule
rm -rf mymodule
git add mymodule
git commit -m “delete submodule”
git push
.gitmodules 没有了作用,可以删除提交推送
subtree(要使用squad参数就都使用,要么就都不使用)
git remote add subtree-origin [email protected]… 配置子项目
git subtree add --prefix=subtree subtree-origin master --squad(压缩压制的意思) 克隆子项目代码到本地 /subtree 目录 --prefix=subtree == --prefix subtree == -P subtree
git subtree pull --prefix=subtree subtree-origin master --squad 更新子项目代码
git subtree push --prefix=subtree subtree-origin master 推送子项目代码
git rebase(不要在与别人共享的分支上进行rebase操作)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5X4jCfUE-1582708384829)(https://i.loli.net/2019/07/18/5d3021e4665da71037.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXTf35xW-1582708384831)(https://i.loli.net/2019/07/18/5d3021f20960650897.png)]
Git其他一些命令
Git图形显示命令
- gitk
- git gui
git gc 垃圾回收
git cherry-pick commid_id 将commit_id上的修改应用到当前分支(commit_id不要是远程分支上的commit_id),应用场景:commid_id不该在原来分支上进行修改