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 git@github.com… mymodule 本地新增子项目

进入到mymodule执行 git pull 更新子项目代码

git submodule foreach git pull 一次性更新所有子项目代码

拉取带有submodule的项目:

  • 执行 git clone git@github.com… 目录名 命令,并不能把子项目中的代码拉下来,要想拉下来子项目代码,需要进入子项目目录,然后执行 git submodule init && git submodule update --recursive
  • git clone git@github.com… 目录名 --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 git@github.com… 配置子项目

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不该在原来分支上进行修改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毫无疑问,Git已经成为当下分布式版本控制系统的翘楚。借助于Git强大的分支、合并、日志、历史追溯、rebase、submodule、subtree等一系列特性,开发者之间的协作变得越来越容易。 Git是由Linus Torvalds开发的;同时,Linus Torvalds也是Linux之父。他开发的这两款软件对于如今的互联网时代影响深远。目前,最为流行和强大的社交化代码平台GitHub上托管着大量项目,其中既有个人开发的、也有诸多优秀的开源项目,如jQuery、React、Netty、Redis、Kafka、Zookeeper等等。如果不充分利用这些优秀的代码宝藏,岂不是最大的遗憾。而且,除了GitHub外,业界还有优秀的in-house代码托管平台Gitlab,这也是国内诸多互联网公司所用的Git代码托管平台,它提供了极为庞大的优秀功能集;让我们可以将公司项目全部托管到其上,而不必担心网络速度问题或是隐私问题。 目前,已经有越来越多的项目开始或是准备开始从传统的svn向Git迁移,在这样的一个时代背景下,如果我们不去深入学习Git,将真正错失这一切的美好。我时常说的一句话就是:“如果你还不Git,那就不用再写代码了”! 相比于svn或是cvs等传统的集中式版本控制系统来说,Git的学习曲线是相当陡峭的。这导致很多学习者在学习一段时间后无法深入,而且由于没有真正、彻底地理解Git的原理与模型,使得即便掌握了不少Git命令,在真正遇到问题时也是束手无策,最终导致放弃学习,而且对Git形成了心理阴影。 纵然如此,优秀的Git依然是每一个对程序开发有追求的人都应该认真且完整地学习的。当你真正掌握了Git后,你才真正领略到Git的美妙,以及为何有如此之多的开源项目都纷纷转向Git而抛弃svn。不得不说的是,Git涉及到的理论与命令是相当多的,这使得很多人望而却步,不知从何开始。 鉴于此,该门课程从一开始对Git进行全面的介绍,接下来全部通过命令完成一个个Git操作,并且通过命令来阐述Git相关的理论,同时对Git涉及到的方方面面特性进行了细致而完整的介绍,最后还通过演示如何搭建内网的Gitlab平台向大家介绍Gitlab在生产系统中使用与运维的诸多细节知识。可以这么说,学习完这门课程后,你对Git的掌握将达到一个非常深入的水准,你对Git的理解也将有颠覆性的认知。 值得注意的是,学习Git一定要动手敲命令而不能借助于IDE帮助我们完成操作,否则你永远也无法体Git的强大以及为开发者所带来的便利。对于Git常见的命令与参数,一定要通过多练习来强化记忆,将其变成自己血液的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值