Git Authoritative Guide 学习
一、git命令
1.git add
-u : 将工作区中所有改动的文件添加到暂存区(修改、删除),但是不提交未被git跟踪的文件
-i : 可以进入交互界面选择性提交
-A : 相对于-u,它还提交新建的文件
2.git format-patch -1 从获取最新一次提交的patch
git format-patch -1 commit-id 获取某一次提交的patch,eg:$ git format-patch -1 0d7c516
3.git grep :在工作区目录下查找,更高效
4.git commit --amend 如果git commit时提交信息写错了可以使用它来修改,修改的是最新一次提交的
eg:git commit --amend -m "use gitg to commit but qgit to change=="
使用图形化窗口gitg或qgit修改更方便!gitg功能更强大!
git rebase -i <hash> :如果修改的不是上一次提交,还要变基(目前还不知怎么用)
5.git rm --cached new.txt 如果不小心把多余的文件添加到暂存区,如此时还没有commit,使用此删除记录(文件还在)
git reset -- filename : 会把暂存区中的文件置为非staged的状态,为git add的反操作,同上。
6.git rev-parse --git-dir 查看自己的git仓库在哪
git rev-parse --show-toplevel 显示工作区根目录
git rev-parse --show-prefix 显示当前目录与工作区的相对路径
$ cat .git/config 可以得出 URL 远程版本库网址
$ git ls-files :查看此版本库管理哪些文件
7.git commit --allow-empty -m "this is empty commit" 没有任何修改也可提交--空白提交
8.git log -s :simple
git log --oneline :只显示一行commit信息
9.git commit -sm "xxxx" : -s表示这次提交的信息中会自动包含提交的签名和邮箱地址
10.git clean
-fd : 会清除工作区中未在暂存区中的文件和文件夹
-nd : 查看会删除那些文件,夹。
11.git cat-file
-t 哈希值 :显示此哈希值代表什么对象,commit(提交),bolb(文件),tree(目录)
-p 哈希值 :打印此哈希值表示的对象的内容
12.HEAD表示当前分支最新提交,^表示上一次提交
13.git reflog show master 筛选显示master分支上的信息
git reflog后使用 git status <hash>查看更改
14.使用git reset --hard <hash> 后此hansh的提交会填充暂存区和工作区,之前的修改会丢失
但是git reflog记录了所有提交信息,使用git reset --hard <old_hash>还会回到之前的状态
15.git merge 对git check out迁出的无名分支merge到分支之上
16.git checkout -- file : 会以暂存区的文件覆盖工作区的文件
git checkout -- . 和 git checkout . 会丢弃掉工作区相对于暂存区的所有更改。
只会对工作区中没有受到git管理的文件操作。
git checkout <hash> <文件名> 此迁出此hash值时的此文件,例如$ git checkout 084e8df Makefile 常用的Makefile可以专门提交到一个分支中,使用时这样checkout出来,很方便。
17.git ls-files --with-tree=HEAD^ 查看历史版本库中的文件列表
18.git tag查看里程碑,也即是查看发布软件的版本号,
git describe 描述距这个发布版本目前多了几次修改,最近的提交的hash值
19..gitignore忽略文件:作用域为此目录及其根目录,只对git管理的文件进行忽略,在其中添加要被忽略的文件
20.git archive -o last.zip HEAD 或者 last.tar.gz 归档打包操作,如果直接使用tar -cf xxxx会将此目录下的所有文件打包过去,无论是不是要忽略的文件
21.查看一个命令的路径:which xxx
22.git blame third.c 追溯一个文件的提交
23.git diff : 工作区与暂存区
git diff --cached 暂存区与版本库
git diff HEAD 工作区与版本库
git diff A :比较工作区和里程碑A
git diff --cached A 比较暂存区和里程碑A
git diff B A :比较里程碑B和里程碑A
24.git log --stat -2 : 比直接-2多出了更改信息
25.git checkout HEAD -- third.c 从版本库中取出third.c到暂存区和工作区
26.将两次提交合并为一次提交:
git reset --soft HEAD^^
git commit -m "xxxxxxx"
27.git show-ref 显示各应用哈希值
28.git clone git@gitlab.com:xxxx/bmp.git manage :clone下拉后重命名为manage
29. git status 用于对比工作区、暂存区、版本库之间的区别
30.
# git fsck 查看版本库中(包含暂存区和工作区)的未被任何应用关联的松散对象
dangling blob 02a2010152982a96e1962cb98eb6d459cd8089af
dangling:就是没有被任何应用直接或间接关联的对象
若已经commit就会被记录在reflog中,使用git fsck --no-reflogs查看,然后将.git/logs下面
清空(此时git log正常显示,git reflog为空),就可以通过git prune清理了
# git prune 清理未被关联的对象,释放空间
31.git reflog expire --all 让90天前的reflog过期
git reflog expire --expire=now --all
32.git rerere gc对合并冲突的历史记录进行过期操作
33.git管家
git gc --prune=now :立即删除非关联的对象,--prune=now会传送个git reflog expire --expire=now,否则2周后清理
git gc: 会对关联的对象进行增量存储,会对非关联的对象变为松散存储
34.git init --bare创建的没有工作区(直接就是.git下的内容)的版本库也可以使用git log等命令
35.git pull : 先拉下来,然后再与本地提交进行合并,合并的先后顺序应该是由提交顺序决定的。
36.git ls-files -s 合并冲突时来看,第三个字段只有在冲突时才会大于0,会看到冲突文件的三个副本
git show :1:README 显示双方冲突的祖先版本
git show :2:README 显示当前冲突文件在当前分支中修改的副本
git show :3:README 显示当前冲突文件在合并分支中修改的副本
也可以使用git mergetool 但是没感觉它好用
37.merge冲突解决:
1.修改了相同文件的相同地方产生git merge冲突,先手动编辑冲突文件的冲突区域并去掉冲突标识符,再git add,再commit
就是合并提交。
2.合并的分支都对同一文件重命了不同的名字产生git merge冲突,删除掉一个冲突文件,再提交即可实现merge 提交
3.git config merge.conflictstyle diff3 、merge(默认)更改默认的文件内容冲突标识,注意没有等号!
38.git打补丁
1.已经提交
获取补丁:git format-patch -1
打补丁: git apply 0001-2.patch
也可以迁出操作,获取历史提交的补丁
2.未提交
git diff master > 000-patch
将master分支上相对于当前提交的所有提交打成一个名为000-patch的patch
回退一次提交打完这次提交的补丁后还能merge
打patch后再修改文件后patch就打不成功了(应该是index变了),文件内容改回去后又可以了!
git diff 2test.c后就可以直接切换分支了,而不用commit!再checkout回去,git diff --cached发现暂存区已经被覆盖了
3.使用commit-id打补丁
git diff acb8cd15(旧) 4ff35d80(新) > 0000-patch
生成了一个000-patch,使用 git apply进行打补丁。
git diff old_hash new_hash > diff.patch 查看两次提交之间的变化,注意后面的是最新的提交。
使用 git format-patch -1 new_hash old_hash 不行
39.git rm --cached file_path_name 删除暂存区中的文件(git add时多添加了可以使用)
40.只恢复一个文件: $ git checkout -- filename
这条命令把hello.rb从HEAD中签出并且把它恢复成未修改时的样子.
41.git revert 是撤销某次操作,此次操作之前和之后的commit都会被保留,并且会把这次撤销作为一次最新的提交;
git revert HEAD 撤销前一次 commit
git revert HEAD^ 撤销前前一次 commit
git revert commit-id 撤销指定的版本,撤销也会作为一次提交进行保存。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容。
git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区;
git reset是还原到指定的版本上,这将扔掉指定版本之后的版本
42.交互式变基
git rebase -i ommit_id进行交互式变基,修改交互时的message信息即可实现修改ID、修改提交顺序的目的(rebase到自己分支之前的状态)
①交互式变基后在repo sync代码后可能会出现:
error: source/linux/: prior sync failed; rebase still in progress
解决:
git rebase --abort
git am --abort(可能不需要)
②git merge来合并所看到的commit的顺序是按时间的先后顺序的,git rebase来合并所看到的commit的顺序不是。
③git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后
把本地当前分支更新为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。
43.检出某个分支中的某个文件
[ubuntu @linux]$git checkout topic/rvc drivers/media/i2c/scxx.c 加的是文件的路径名
[ubuntu @i2c]$ git checkout topic/rvc_v3.4 sc00.c
45.只查看某个人的提交记录:[ubuntu @linux]$ git log --author="Jinda Fu"
46.git cherry-pick --continue cherry-pick解决冲突后继续cherry-pick
47.git add directory -A 将这个目录中的说有修改全部提交,包括删除的和新增的
48.查看两个tag之间的提交
$ git log --pretty=oneline tag1...tag2 --pretty=oneline打印出完整的hash
34ba8419b037f8fc018d554db641806c4abcdae6 Merge branch 'topic/sd-reader' into 'master'
$ git log --oneline tag1...tag2 --oneline只打印出部分hash
34ba841 Merge branch 'topic/sd-reader' into 'master'
49. git设置别名
$ git config --global alias.br branch
$ git config --global alias.li "log --oneline"
--global的修改会体现在~/.gitconfig文件中(若不加--global是.git/config),也可以直接修改这个文件进行git配置。
50. 要查看远程库的信息,用git remote, -v显示更详细的信息
51.查看git版本库位置
strace -e 'trace=file' git status // 追踪git status的磁盘访问
git rev-parse --show-toplevel // 显示工作区根目录
git rev-parse --git-dir // 显示版本库.git目录所在位置
git rev-parse --show-prefix // 相对于工作区根目录的相对目录
git rev-parse --show-cdup // 从当前目录后退到工作区的深度
在git工作区的某个子目录下执行操作时,会在工作区目录中依次向上递归查找.git目录,找到的.git目录就是工作区对应的版本库,.git所在目录就是工作区的根目录,文件.git/index记录了工作区文件
的状态(实际上是暂存区的状态)。
二、使用git打补丁
1.检测补丁有无问题
$ git apply --check xxx.patch
2. error: xxxxx: patch does not apply
出现这种一般会是补丁冲突,这种一般是强制打上补丁(使用--reject)后根据产生的*.rej文件来手动解决冲突。
3. warning: xxxx.c has type 100644, expected 100755
出现这种警告一般是文件内没有冲突,但是文件的权限发生变动。一般没有影响。
4.强制打补丁
$ git apply --reject xxx.patch
然后再手动修改冲突,find ./ -name *.rej找到这些冲突的补丁,手动打上
5.git am同样有--reject选项,添加这个选项可以将能打上的补丁先打上,冲突的文件生成*.rej文件。
39.分支变基
1.可以checkout out很久以前的提交,然后git checkout -b sfl创建新分支,gitg会发下它很靠后,然后
git rebase master就发现它骑在了master分支的头上,然后commit一次发现在master头上有一次提交
40.本地分支分支重命名
git branch -m old_local_branch_name new_local_branch_name
41.远程分支操作:
1.$ git branch -a :加上-a参数可以查看远程分支,远程分支会用红色表示出来
2.$ git push origin --delete <branchName> : 删除远程分支
或者$ git push origin :<branchName> : 推送一个空分支到远程分支,其实就相当于删除远程分支
3.$ git push origin --delete tag <tagname> : 删除远程分支的tag
4.git tag -d <tagname> : 应该是删除本地tag
git push origin :refs/tags/<tagname> 推送一个空tag到远程tag,也就达到了删除远程分支的tag的效果
5.$ git remote show origin : 查看远程分支的状态
6.$ git remote prune origin : 若此分支对应的远程分支已经被删除,使用它来将本地对应分支从本地版本库中去除
7.重命名远程分支 :其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。eg.将devel分支重命名为develop分支
git branch -av 查看分支
git push --delete origin devel 删除devel分支
git branch -m devel develop 重命名本地分支
git push origin develop 推送本地分支
8.$ git push --tags : 推送本地tags
9.$ git fetch origin tag <tagname> : 获取远程tag
参考:
https://makandracards.com/makandra/621-git-delete-a-branch-local-or-remote
https://blog.zengrong.net/post/1746.html
42.合并服务器上的代码
创建一个本地master分支: git branch master, git checkout master
reset到远程服务器上的master分支:git reset --hard origin/master
将远程的update分支merge到master分支: git merge origin/topic/update --no-ff (--no-ff:创建合并提交)
将本地的master分支推送到远程服务器:git push origin master:master
查看验证:git fetch -p gitg &
将master分支merge到项目分支:
git merge master --no-ff
git push origin g8s/master:g8s/master
43.在历史提交中快速查找iperf相关提交
$ git log --oneline | grep iperf
44.增加签名: git commit -s -m "commit message" -s签的是自己的名字
45.使用git am来保留patch作者的信息
patch -p1 < 0001--JFFS2-community-fix-with-not-use-OOB.patch
这样来打patch,但是这样会把这些有用的信息丢失。由于这些patch显然是用git format-patch来生成的,所以用git的工具应该就可以很好的做好。
git -am 可以保留这些信息。
在使用git -am之前,你要首先git am –abort 一次,来放弃掉以前的am信息,这样才可以进行一次全新的am。
不然会遇到这样的错误: .git/rebase-apply still exists but mbox given.
git-am 可以一次合并一个文件,或者一个目录下所有的patch,或者你的邮箱目录下的patch.
git am XXX/*.patch 将XXX目录下的所有patch打上去,这里git就会按照文件名的顺序一次am这些patch
git am *.patch
在解决完冲突以后,可以用git add来让git知道你已经解决完冲突了。
可以运行git am –abort,撤销整个am的东西
如果忽略某一个patch,可以运行git am –skip来跳过这个patch.
46.$ git log --author=Li.ming 查看某一个人的提交,注意是.而不是,
$ git log origin/g6s/master --author=Xiao.liang
47. .git/config文件中有版本库的网址等信息
git使用小技巧:
1.git log:
git log --oneline ./ 只看当前目录下的所有文件的提交记录
git log --oneline app_test.c 只看与app_test.c相关的提交
git log --oneline --graph ./ 对当前目录下的文件的提交以graphic的形式看
二、本地git配置
1.使git带颜色显示
git config --global color.ui true
2.git命令自动补全
需要在/etc/profile和~/.bashrc中添加
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
但是最好不要添加,会导致Ubuntu无法登陆,将其单独写成一个脚本使用时执行一次。
由此导致无法登陆解决方法:
ctrl + alt + F1进入命令终端,然后删除更改。
3.禁止非快进试推送
git [--git-dir=/path/to/xxx.git] config receive.denyNonFastForwards true
3.三级配置
git config -e :修改此git仓库配置.git/config,显示如下
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@gitlab.com:TYTHT/bmp.git
[branch "master"]
remote = origin
merge = refs/heads/master
git config -e --global :修改针对此用户的git仓库配置~/gitconfig,显示如下
[color]
ui = true
[user]
name = pinctl
email = 2634520619@qq.com
git config -e --system :修改针对此系统的git仓库配置的/etc/gitconfig,里面暂时为空
三、在github上创建版本库
GitHub 是一个网站,它提供 Git 仓库托管服务的。 只要注册一个 GitHub 账号,就可以免费获得 Git 远程仓库。
对于第 1 次使用 GitHub,需要:
(1) 创建 SSH Key:$ ssh-keygen -t rsa -C "your email"
(2) 注册 GitHub 用户:登录 https://github.com/ 注册账户
(3) 在 GitHub 里添加 SSH Key:点击网页右上角的按钮,选择“Settings”, 将第一步生成的~/.ssh/id_rsa.pub内容添加到Key栏后点击“Add Key”
(4) 创建仓库:点击网页右上角的“+”号,选择“New repository”:
GitHub 需要SSH Key的原因是要识别出你推送的提交确实是你推送的,而不是别人冒充的,而 Git 支持 SSH 协议,所以, GitHub 只要知道了你的公钥,就可以确认
只有你自己才能推送。
GitHub 允许你添加多个 Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的 Key 都添加到 GitHub,就可以在每台电脑上往 GitHub 推送了。
在 GitHub 上免费托管的 Git 仓库,任何人都可以看到喔(但只有你自己才能改)。
(5) 添加文件并推送到版本库
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/xxxx/Android_work.git
git push -u origin master
(6)下载和查看源码
a.可以直接在版本库的网址上查看源码
b.下载:git clone https://github.com/xxxx/Android_work.git
四、总结
1.每次git commit,工作区必须是干净的(即所有修改都已经git add; 是工作区,不是暂存区)
2.分支名如果不像这样topic/msater,而是一个简单的名字的话,就算是有分支,好像还是在master分支之上。
3.gitg是从最新更改开始画图,git log是从HEAD开始打印,gitg显示的select branch就是没有分支名的迁出分支
4.git checkout和git reset不同,前者是迁出,HEAD指向并没有变,后者HEAD变了。
5.mv针对工作区的修改 git mv是针对暂存区的修改
6.暂存区变了就可以使用git commit, 而没有必要非要先git add等操作
7.gitg也可以完成commit功能!
8.修改相同文件的不同地方merge时不会产生冲突,相同地方会产生冲突。
五、问题
1. 使用Yocto 编译新BSP的时候可以把build/tmp目录下的所有文件删除,若还是不行,可以把下面两个目录下的*.done文件全部删除,然后重新编译即可。
build/downloads/
build/downloads/git2
六、优秀资源链接
1.廖雪峰git教程
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374385852170d9c7adf13c30429b9660d0eb689dd43a000
Git Authoritative Guide 学习的更多相关文章
- Git的初步学习
前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...
- git 源码学习(init-db) 提交版本号 083c516331
写在前面的废话: 学完git之后,还是感觉云里雾里的,于是乎,就想到了通过学习git源码,来加深git的熟练度,同时学习一下c语言编程. git源码学习,逐步分析 这篇帖子是逐步分析git源码的,将g ...
- 很棒的git和python学习网站
很棒的git和python学习网站:http://www.liaoxuefeng.com/ 博主名叫廖雪峰
- Git使用教程学习
Git使用教程学习 在第十二周的个人作业上,王文娟老师希望我们去自己课后了解一下git的使用方式以及一些基础知识,在本学期其他的课程上,我们已经稍微了解过一些git的基础知识,因此在本次作业里,我补充 ...
- 廖雪峰 Git 教程 + Git-Cheat-Sheet 学习总结
廖雪峰 Git 教程 + Git-Cheat-Sheet 学习总结 本教程主要是个人的 Git 学习总结. 主要参考博客: 廖雪峰 Git 教程 Git-Cheat-Sheet 文章目录 廖雪峰 Gi ...
- (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作
1 简介 大家好我是费老师,Git作为世界上最流行的版本控制系统,可以说是每一位与程序打交道的朋友最值得学习的软件之一.除了管理自己的项目,如果你对参与开源项目感兴趣,那么Git更是联结Github. ...
- Git版本控制管理学习笔记3-基本的Git概念
为了更近一步的学习和理解Git的理念,这一节介绍一下Git中的一些基本概念. 基本概念 对象库图示 Git在工作时的概念 一.基本概念: 1.版本库: Git的版本库就是一个简单的数据库,其中 ...
- Git分布式版本控制学习
git和SVN都是版本控制系统.git是命令行操作,不喜欢的就算了,看完如果有身体不适还请及时就医~ git WIN32百度网盘下载地址:http://pan.baidu.com/s/1c1AeY9 ...
- 我的git与github学习历程
因为想要知道如何把代码放到github上,所以就百度了一下,然后找到一个<如何从github上面拷贝源码>的文章,就先进行练习了下 1.首先到git官网下载git版本控制工具的安装包, ...
随机推荐
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛
题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...
- 43 HTML CSS
第一部分: 1.meta 标签中:meta 标签中 <meta http-equvi = "refresh" content="2;URL= https://www ...
- 使用python,将excel数据批量导入数据库
这是上一篇文章的优化版本,相较于一条一条的执行sql语句,本文中,将excel中所有的数据先写到list列表中 在通过函数 cursor.executemany(sql, list) 一次性写入到数据 ...
- CCF 2015-03-4 网络延时
题目:http://115.28.138.223/view.page?gpid=T24 题意就是让求树上的任意两个节点间的距离的最大值.就是树的直径. 首先树的直径模板转载自http://www.07 ...
- weblogic下更改jsp不生效的解决办法
1.删除user_projects\domains\base_domain(我自己的域名)\servers\AdminServer目录下的所有文件夹 一下为转载from:http://blog.itp ...
- 团队NABCD
NABCD 你的创意解决了用户的什么需求?(N) 每学期开学同学们都有相同的困难:我该选哪几门课?这门课到底是做什么的?有时候上一届的学长学姐会告诉我们他们觉得好的课,但这并不全面.所以我们需要一个平 ...
- oracle之TRUNC函数
TRUNC(number,num_digits) Number 需要截尾取整的数字. Num_digits 用于指定取整精度的数字.Num_digits 的默认值为 0.如果Num_digits为正数 ...
- 关于CentOS 7 下的Oracle11g的proc编译器的一些常见问题
1.proc编译器配置问题 在使用proc将.pc文件编译成.c文件时出现一堆的错误,网上的答案七杂八杂的,都没有解决我的问题. 如下是我在使用过程中的一些错误: 由于我可能比较笨,实在是受不了网上那 ...
- hadoop IPC 源代码分析
如图所示, 在hadoop中客户端需要和服务端通信 . 首先我们看一下需求是啥. 举一个例子,在客户端想要往hadoop集群中写数据的时候,它需要先和namenode通信,以便获得 诸一 ...
- IOS的各种控件(转载,防止遗忘)
UITextView控件的详细讲解 感觉写的相当不错,而且很全就直接转载了 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: #import <UIKit/UIKi ...