将多个commit rebase合并为一个提交

1 查看日志

查看需要汇总几个commit的,记下最旧的id或者倒数第几个,然后选择reset 或者rebase方法

例如下面有5个提交,想要把从3到5的提交汇总在一起作为一次提交,得到 1 2 6{3 4 5的汇总}

git reflog
05a3854 (HEAD -> main) HEAD@{4}: commit: 5
e125d52 HEAD@{5}: commit: 4
ec70c06 HEAD@{6}: commit: 3
a4621de HEAD@{7}: commit: 2
065dc62 HEAD@{8}: commit (initial): 1
继续阅读“将多个commit rebase合并为一个提交”

Git 和svn对比

  • git版本库占用空间小;
  • git是分布式管理系统,完全可以不对代码进行备份;
  • git不用时时联网查询;
  • 如果客户端离服务器端非常远,在网速糟糕的情况下,用svn下载代码速度远不上git。
  1. git版本库占用空间小,SVN每个分支都是一份代码的copy,而git每个分支只是各个提交点的hash值的集合。分支几乎不占用什么空间。
  2. git是分布式管理系统,完全可以不对代码进行备份,但SVN不行,一旦服务器的硬盘挂掉整个代码库就完了。
  3. git不用时时联网查询,并且对文件进行压缩,使得文件体积大大减小,并且传输速度快,svn是单个文件,git是压缩后的,在使用svn时我已经碰到过好几次服务器无响应了。由于git很多都可以在本地操作的,所以大大降低了客户端对服务器的连接,出现这种情况的概率会大大减小。

diff 生成补丁 打补丁

1、生成补丁

diff -rabBup file1 file2> patch1

diff 【选项】 源文件(夹) 目的文件(夹) 

-r:递归,设置后diff会将两个不同版本源代码目录中的所有对应文件都进行一次比较,包括子目录文件; 

-N:确保补丁文件将正确地处理已经创建或删除文件的情况; 

-u:一体化diff输出(参见例1) 

-E, -b, -w, -B, –strip-trailing-cr 

忽略各种空白,可参见文档,按需选用。

-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.

-p 显示代码所在的c函数的信息.

2、打补丁

patch 命令

patch的作用则是将diff记录的结果(即补丁)应用到相应文件(夹)上。最常见的用法为:

patch -pNUM <补丁文件 

p Num:忽略几层文件夹,随后详解; 

-E :说明如果发现了空文件,那么就删除它; 

-R:取消打过的补丁。

为了解释 -p 参数,需要看看如下patch文件片段:

— old/modules/pcitable       Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable       Tue Dec 19 20:05:41 2000

  • 如果使用参数-p0,那就表示忽略当前old文件夹开始执行patch操作;
  • 如果使用参数-p1,表示忽略第一层目录(即不管old),从 modules 文件夹开始进行patch操作。

应用

利用以上命令,处理单个文件补丁的方法:

# 产生补丁
diff -uN file1 file2 >file.patch

# 打补丁
patch -p0 < file.patch

# 取消补丁
patch -RE -p0 < file.patch

对整个文件夹打补丁的情况:

# 产生补丁
diff -uNr dir1 dir2  >dir.patch

# 打补丁
cd dir2
patch -p1 < dir.patch

# 取消补丁
patch -R -p1 <dir.patch

patch 文件构成

补丁文件里到底存储了哪些信息呢?看看这个例子:

— test0 2006-08-18 09:12:01.000000000 +0800
+++ test1 2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
 111111
-111111
+222222
 111111

补丁头 

补丁头是分别由—/+++开头的两行,用来表示要打补丁的文件。—开头表示旧文件,+++开头表示新文件。

一个补丁文件中的多个补丁 

一个补丁文件中可能包含以—/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

 

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

块的缩进 

块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

块的第一列 +号表示这一行是要加上的。-号表示这一行是要删除的。没有加号也没有减号表示这里只是引用的而不需要修改。

Git windows凭据

在Windows上git的密码是交给window进行管理的需要进入“控制面板”–“用户账户” –“凭证管理,管理windows凭据” 点开后有git:xxx的凭据,删除还是修改看自己意愿修改即可

如何避免自动保存凭据

git config –edit –system 

删除 helper = manager 

另外可以额外配置 

git config –edit –global 

[core]
    askpass =

git设置config

# 删除一条配置信息
git config –unset user.name

# 删除所有配置信息
git config –unset-all

二.你的标识(Your Identity)

2.1 当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:

  $ git config –global user.name “John Doe”

   $ git config –global user.email johndoe@example.com

   重申一遍,你只需要做一次这个设置。如果你传递了 –global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要–global选项。

2.2 你的编辑器(Your Editor)

  现在,你的标识已经设置,你可以配置你的缺省文本编辑器,Git在需要你输入一些消息时会使用该文本编辑器。缺省情况下,Git使用你的系统的缺省编辑器,这通常可能是vi 或者 vim。如果你想使用一个不同的文本编辑器,例如Emacs,你可以做如下操作:

  $ git config –global core.editor emacs

2.3 你的比较工具(Your Diff Tool)

  另外一个你可能需要配置的有用的选项是缺省的比较工具它用来解决合并时的冲突。例如,你想使用vimdiff:

  $ git config –global merge.tool vimdiff

   Git可以接受kdiff3,tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 和 opendiff作为有效的合并工具。你也可以设置一个客户化的工具;查看第7章获得更多关于此的信息。

2.4 检查你的设置(Checking Your Settings)

  如果你想检查你的设置,你可以使用 git config –list 命令来列出Git可以在该处找到的所有的设置:

  $ git config –list

  user.name=Scott Chacon

  user.email=schacon@gmail.com

  color.status=auto

  color.branch=auto

  color.interactive=auto

  color.diff=auto

  …

  你可能会看到一个关键字出现多次,这是因为Git从不同的文件中(例如:/etc/gitconfig以及~/.gitconfig)读取相同的关键字。在这种情况下,对每个唯一的关键字,Git使用最后的那个值。

  你也可以查看Git认为的一个特定的关键字目前的值,使用如下命令 gitconfig {key}:

  $ git config user.name

  Scott Chacon

2.5 获取帮助(Getting help)

  如果当你在使用Git时需要帮助,有三种方法可以获得任何git命令的手册页(manpage)帮助信息:

  $ git help <verb>

  $ git <verb> –help

  $ man git-<verb>

   例如,你可以运行如下命令获取对config命令的手册页帮助:

  $ git help config

   这些命令非常友好,因为你可以在任何地方存取他们,即使非在线状态。如果手册页和本书仍然不足而你需要个人的帮助,你可以试着使用FreenodeIRCServer上的#git或#github 频道(irc.freenode.net)。这些频道会定期由数百个对Git非常熟悉的专业人士所维护,他们会非常乐意帮助你。

2.6 总结(Summary)

  你应该对Git是什么以及Git与你可能使用的其它CVCS之间的不同有了一个基本的了解。你也应当在你的系统中有了一个具有你个人标识的可以工作的Git版本。是时候来学习一些Git的基本知识了。

换行符转换

git config –global core.autocrlf false

#提交时转换为LF,检出时转换为CRLF

git config –global core.autocrlf true

#提交时转换为LF,检出时不转换

git config –global core.autocrlf input

SafeCRLF

#拒绝提交包含混合换行符的文件

git config –global core.safecrlf true

#允许提交包含混合换行符的文件

git config –global core.safecrlf false

#提交包含混合换行符的文件时给出警告

git config –global core.safecrlf warn

Git log查看

检查某人提交文件

git log –author=”wangxingjing”  –stat

按关键词搜索

git log –grep=comment注释的关键词

// 查询所有提交者

git log –since ==2018-12-25 –until=2019-09-28 –format=’%aN’ | sort -u |

while read name;

 do echo -en “$name\t”;

 git log –author=”$name” –pretty=tformat: –numstat | awk ‘{ add += $1; subs += $2; loc += $1 + $2 } END { printf “added lines: %s, removed lines: %s, total lines: %s\n”, add, subs, loc }’ -;

Done

//单行格式

git log –since ==2018-12-25 –until=2019-09-28 –format=’%aN’ | sort -u | while read name;do echo -en “$name\t”;git log –author=”$name” –pretty=tformat: –numstat | awk ‘{ add += $1; subs += $2; loc += $1 + $2 } END { printf “added lines: %s, removed lines: %s, total lines: %s\n”, add, subs, loc }’ -; done

//-表示上一个过程的输出

// 查询单人

git log –since=2018-09-01 –until=2019-09-28 –author=”author-name” –pretty=tformat: –numstat

 | gawk ‘{ add += $1 ; subs += $2 ; loc += $1 – $2 } END { printf “added lines: %s removed lines : %s total lines: %s\n”,add,subs,loc }’ –

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上

–pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。

format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:

 $ git log –pretty=format:”%h – %an, %ar : %s”

ca82a6d – Scott Chacon, 11 months ago : changed the version number

085bb3b – Scott Chacon, 11 months ago : removed unnecessary test code

a11bef0 – Scott Chacon, 11 months ago : first commit

下表列出了常用的格式占位符写法及其代表的意义。

常用的格式占位符

git log 命令支持的常用选项及其释义。

选项及释义

git log常用搜索条件

Git 操作总结

一、在A机器上创建项目

1、eclipse创建项目

2、github创建仓库

3、eclipse share project,连接github

4、fetch remot from github,merge

5、push to github

二、B机器从git创建项目

7、import from git

8、选择存放路径,这里存放路径就是eclipse实际路径,没有保存到原workspace

9、fetch from remote,然后merge ,先fetch才可以后续push,如果无法push可能是没有fetch最新代码

10、修改编辑代码

11、push remote

三、A获取更新代码

12、fetch remot from github,merge

四、无法添加lib/jar

13、选择lib,ignore

14、编辑ignore文件,找到位置 添加!

五、回滚

15、选择项目,show history 选择提交,revert commit

16、revert commit不能解决的reset 强制回滚(慎用)

删除Git仓库所有提交历史记录,成为一个干净的新仓库

场景

把旧项目提交到Git上,但是会有一些历史记录,这些历史记录中可能会有项目密码等敏感信息。如何删除这些历史记录,形成一个全新的仓库,并且保持代码不变呢?

操作

Checkout

git checkout –orphan latest_branch

Add all the files

git add -A

Commit the changes

git commit -am “commit message”

Delete the branch

git branch -D master

Rename the current branch to master

git branch -m master

Finally, force update your repository

git push -f origin master

强制pull远端覆盖本地文件

git fetch –all 

git reset –hard origin/master

Svn 和git 同时使用

已经是git仓库情况

1、svn checkout

2、svn status 查看状态,会有许多删除冲突

3、使用revert命令恢复 svn revert ./* -R [或者单独文件 R递归]

4、再次查看状态,删除冲突消失

5、git pull ,git reset –hard 清除svn的更改,然后查看git 和svn状态是否正常,

6、修改,往两处提交就可以了

此过程可能需要多次gc cleanup

1 Svn checkout

2 git pull

3 换行符问题

4 git 修改为 autocrlf

5 Add 提示有些lf转换问题

6 再改为autocrlf false

7 再次add

腾讯云图