Git学习笔记

Git是Linux之父Linus开发的分布式代码管理工具,也是目前最流行的开源代码管理工具。许多开源项目,包括

Linux,U-Boot等等都在使用Git进行代码管理。

1.Git安装

Ubuntu下直接在shell下面运行:

sudo apt-get install git

Windows下直接去下面网站下载msysgit(包含一个命令行界面和一个GUI界面):
http://code.google.com/p/msysgit/downloads/

2.Git使用帮助

2.1所有支持的命令

git help

对于某个命令,例如config

git help config
git config --help

注意:git支持TAB键补全,包括命令和变量。对Linux用户,如果该功能没打开,可以在~/.bashrc中加入:

# Enable Git command auto-completion

source /etc/bash_completion.d/git

然后在shell中重新执行bash命令。

2.2 提交ID或者各种标签(HEAD,tag, stash@{n},branch名称等等,本质上都是提交ID)的后缀

^或者^1或者~或者~1:当前提交的第一个父提交
^2:当前提交的第2个父提交,如果该提交有多个父提交(merge或者stash(工作进度暂存)引起的)
^^或者~2:当前提交的第一个父提交的第一个父提交
^2^或者^2^1:当前提交的第2个父提交的第一个父提交
^{}或者^{commit}:当前提交的提交ID
^{tree}:当前提交的树ID

范围形参数的表示方法:rev1..rev2

2.3 diff结果阅读

结果:

diff --git a/src/test.txt b/src/test.txt
index ff0303a..3ccac05 100644
--- a/src/test.txt
+++ b/src/test.txt
@@ -1,3 +1,3 @@
+modified

-orign
+tested

解释:

--- a/src/test.txt :原始文件(以---开头)
+++ b/src/test.txt :目标文件(以+++开头)
@@ -1,3 +1,3 @@ :当前差异块的比较对象为原始文件的第1行开始的3行与目标文件的地1行开始的3行
-orign :只存在于原始文件(以-开头)
+modified :只存在于目标文件(以+开头)
以空格开头 : 同时存在于原始文件和目标文件

2.4 merge结果阅读

<<<<<<<
当前分支
=======
待合并的分支
>>>>>>>

3.Git配置(可选)

git config -l 显示所有用户配置

git config --global user.name 用户姓名
git config --global user.email 用户邮箱

git config --global color.ui auto

git config --global merge.tool kdiff3
git config --global diff.external kdiff3
git config --global core.editor vim

git config --global --unset xxxxx

4.创建数据库(服务器上)

建立一个用于提交代码的共享数据库,在服务器上没有本地文件
git init --bare --shared=all 项目名称(xxx.git)

5.克隆一个本地分支

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

6.日常用法

6.1 显示状态

详细信息(包括本地分支和远程分支的关系等等,如果领先远程分支,可用git cherry获取未push到远程分支
的本地提交;如果落后,则需执行git pull)

git status

简单信息

git status -sb

6.2 把代码加入到暂存区

指定文件或者目录加入到暂存区

git add 目录或者文件名

工作区中所有改动和增删文件(包括untracked文件,可以新增文件)加入到暂存

git add -A

更新工作区中所有tracked文件的改动到和删除到暂存区

git add -u

交互式

git add -i 目录或者文件名

patch模式添加文件

git add -p 目录或者文件名

6.3 从暂存区提交到本地数据库

git commit -m 注释

或者启动默认编辑器编辑注释

git commit

追加或者更改上一次提交的注释

git commit -amend

重用某次提交的注释

git commit -C 提交ID或者标签

跳过add命令直接提交代码(修改不经过暂存区,无确认过程,轻度危险,尽量不要使用)

git commit -a

无代码修改提交(通常用于创建代码仓库后的第一个提交

git commit --allow-empty

6.4 文件操作

删除某个文件

git rm 文件名或者目录名

移动或者更名文件

git mv

汇总显示工作区、暂存区与HEAD差异

git checkout

用暂存区内容覆盖工作区(危险,可在后面加上 > xxx 另存到其他文件)

git checkout 文件名

用指定提交的文件替换暂存区和工作区内容(危险,可在后面加上 > xxx 另存到其他文件)

git checkout 提交ID或者标签 文件名

替换所有本地文件(极度危险)

git checkout .

6.5 显示修改记录

6.5.1 整个数据库的修改记录

git log

图形化显示并跟踪修改(显示当前提交ID,目录树ID和父提交ID(可能会有多个父提交))

git log --pretty=raw --graph

单行图形化显示

git log --graph --oneline

显示数据库内文件移动复制记录

git log -C -C -l -p

显示所有提交修改概要

git log --stat

显示详细信息

git log --pretty=fuller

显示指定提交修改概要

git show 提交ID或者标签 --stat

6.5.2 某个文件修改记录

git blame -L 起始行,结束行 文件名
git blame -L 起始行,+行数 文件名

文件内移动复制记录

git blame -M 文件名 

6.6 比较

比较工作区与暂存区中的文件

git diff 文件名

比较工作区与某个提交

git diff 提交ID或者标签 文件名

比较暂存区与某个提交中文件

git diff --cached 提交ID或者标签

比较2个版本(不加文件名表示比较所有文件)

git diff 提交ID或者标签 提交ID或者标签 文件名

生成patch

提交后:git diff -c -p HEAD^ > patch_xxx.txt
提交前:git diff -c -p HEAD > patch_xxx.txt

逐字比较(默认逐行)

git diff --word-diff 文件名

使用外部比较

git --ext-diff 文件名

6.7 保存和恢复工作进度

保存暂存区河工作区中的tracked文件

git stash

保存暂存区河工作区中的tracked文件并包括注释

git stash save “xxxxx”

查看工作进度缓存

git stash list

查看某个缓存的内容

git stash show stash@{进度ID}

恢复工作进度

git stash pop stash@{进度ID}

git stash apply stash@{进度ID}

清除工作进度

git stash clear

6.8 数据库交互

从远程仓库获取分支信息和修改但不合并

git fecth

从服务器取数据并合并到本地数据库

git pull

提交某个分支代码到服务器数据库

git push origin 分支名称或者tag名称

6.9 patch操作

生成summary,为每个提交生成一个detail patch,并签名

git format-patch --cover-letter -s 起始提交ID或者标签..结束提交ID或者标签

应用patch

patch -p1 < xxx.patch

7.分支操作(可选)

显示所有分支和当前工作分支详细信息(名字,修改记录,提交ID)

git branch -v

从某个提交创建分支并切换到新分支(主分支可用来跟服务器同步)

git checkout -b 分支名称 提交ID或者标签(可省略,默认为HEAD)

切换分支

git checkout 分支名称

rebase当前分支

git rebase --onto master 当前分支

从其他分支merge到当前分支

git merge 其他分支

出现merge冲突后对启动图形界面

git mergetool 文件名(可选)

删除分支(分支必须先merge到其他分支,否则失败)

git branch -d 欲删除分支

强制删除分支(不检查分支已是否merge到其他分支)

git branch -D 欲删除分支

重命名分支

git branch -m 新名称

查看远程分支

git branch -r -v

建立远程分支

git push -u origin <本地分支>

8. 版本库查看

显示暂存区(最新提交)中的文件

git ls-files

显示指定提交中的文件

git ls-files --with-tree=提交ID或者标签

显示版本库目录树

git ls-tree -l -r -t 提交ID或者标签

显示暂存区目录树

git write-tree | xargs git ls-tree -l -r -t

查看目录树中某个对象的内容(blob对象存放文件内容)

git cat-file -p 对象ID

或者 (对象类型包括commit, tree,tag or blob)

git cat-file 对象类型 对象ID

查看某个命名版本中(例如分支名称或者HEAD)某个对象的内容

git cat-file blob HEAD:文件路径

查看某个分支或者某次提交的commitID

git rev-parse 提交ID或者标签

9.版本库操作(小心使用)

首先执行下面命令确保分支日志功能打开

git config core.logAllRefUpdates

不更新HEAD指针仅用目的版本的某个文件内容替换暂存区中的文件

git reset 提交ID或者标签(HEAD^, HEAD~1等等) 文件路径

将HEAD指针回溯到某个历史提交

git reset --soft 提交ID或者标签(HEAD^, HEAD~1等等)

将HEAD指针回溯到某个历史提交并用目的提交的内容替换暂存区内容

git reset 提交ID或者标签(HEAD^, HEAD~1等等)

或者

git reset --mixed 提交ID或者标签(HEAD^, HEAD~1等等)

将HEAD指针回溯到某个历史提交并用目的提交的内容更新暂存区和工作区

git reset --hard 提交ID或者标签(HEAD^, HEAD~1等等)

显示版本操作日志

git reflog show

逆向恢复到某次操作后的状态(例如倒数第3次)

git reset master@{2}

10.分离头模式查看历史版本

checkout某个历史版本用以查看内容、测试和提交
(当前分支和HEAD指针指向不同的引用git rev-parse查看,切换回当前分支后HEAD指针恢复)

git checkout 提交ID或者其他代号(HEAD^, HEAD~1等等)

查看在分离头模式中做的修改

git show 提交ID

merge到当前分支

git merge 提交ID

11.标签tag

打标签

git tag -m "xxxx" tag名称

打签名标签(GnuPG签名,包括创建时间、创建者等等,可用git tag -v验证,签名可用gpg --gen-key生成)

git tag -m "xxxx" tag名称

删除

git tag -d tag名称

显示当前标签(输出可用作版本号)

git describe

查看所有tag

git tag -n

查看某个tag

git show tag名称

或者

git cat-file tag tag名称

显示带标签的日志

git log --oneline --decorate

更新到远程服务器

git push orign tag名称

查看远程服务器的tag

git ls-remote origin

删除远程服务器上的tag

git push orign :tag名称

12.二分法查找错误提交

开始

git bisect start

标志坏提交

git bisect bad 提交ID

标志好提交

git bisect good 提交ID

查看log

git bisect log

13.删除错误提交

13.1 cherry-pick方式

13.1.1 checkout错误提交的前一个提交

git checkout 错误提交ID或者其他代号^

13.1.2 找出所有需要的版本

git cherry-pick 提交ID或者其他代号

13.1.3 重置版本树到最近一次提交(修改后的)

git checkout 当前分支名称

git reset --hard HEAD@{1}

13.2 rebase方式
13.2.1.手动模式

git rebase --onto <newbase> <since> <till(不写则为HEAD)>
该命令执行过程:
1.用checkout切换到<till>
2.将 <since>和<till(不写则为HEAD)>之间的提交(不包括<since>)写入临时文件
3.当前分支强制重置(reset --hard)到<newbase>
4.将临时文件中的提交逐一顺序提交到<newbase>
5.遇到已存在的提交则跳过,遇到冲突则暂停。手动解决冲突后,用git rebase --continue继续,
也可以不解决冲突直接git rebase --skip跳过或者git rebase --abort终止本次rebase操作。

执行完rebase命令后重复13.1.3重置版本树即可。

13.2.2 交互模式

git rebase -i <newbase>

13.3 重置本次操作

git reset --hard 原始版本最后一次提交ID

14.其他命令

查看所有引用

git show-ref

从某个提交新建一个版本树(丢掉以前记录)

echo “提交注释” | git commit-tree 提交ID或者标签^{tree}

git rebase --onto 前1条命令返回的提交ID 提交ID或者标签 当前分支名称

回退某个提交

git revert 提交ID或者标签

清除工作区中的untracked文件

git clean -fd

打包

git archive -o xxx.zip 提交ID或者标签
git archive -o xxx.tar 提交ID或者标签
git archive -o xxx.tar.gz 提交ID或者标签

更改远程数据源地址

git remote set-url origin <URL>

显示远程数据源地址

git remote show origin

忽略文件

添加忽略文件名到.git/info/exclude



原文地址:https://www.cnblogs.com/EmbeddedLiving/p/3446829.html