本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1:本地分支与远端分支建立关联
git branch --set-upstream-to=origin/remote_branch local_branch
or
git branch --track local_branch origin/remote_branch
2:如何复制一个仓库
1)从原地址克隆一份裸版本库。
git clone --bare ssh://....(原始仓库地址)
2)进入克隆下来的目录
cd project.git(project即为你的项目名称)
3)以镜像推送的方式上传代码到新的仓库地址。
git push --mirror ssh://...(目标仓库地址)
3:Git查看log日志,根据条件进行查询
显示utanb012合入的日志
git log --author="utanb012" --pretty='%h|%ci|%an|%s'
显示6.1到6.10的日志
git log --since='2021-06-01' --before='2021-06-10' --pretty='%h|%ci|%an|%s'
显示1天以内的日志
git log --since=1.days --pretty='%h|%ci|%an|%s'
如果还想定制更酷的日志,--pretty=format可以参考如下参数:
%H 提交的完整哈希值
%h 提交的简写哈希值
%T 树的完整哈希值
%t 树的简写哈希值
%P 父提交的完整哈希值
%p 父提交的简写哈希值
%an 作者名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date=选项 来定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期(距今多长时间)
%s 提交说明
git log 的常用选项:
-p 按补丁格式显示每个提交引入的差异。
--stat 显示每次提交的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
--relative-date 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
--graph 在日志旁以 ASCII 图形显示分支与合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
--oneline --pretty=oneline --abbrev-commit 合用的简写。
4:手动删除的文件如何在git中删除
在日常开发中,我们可能会手动删除(delete删除)一些文件,然而我们本来应该是用git rm filename命令删除的,但现在我们手动删除了,那么如何在git里将那些手动删除的文件删除呢?
解决方案一:
git rm files 删除你手动删除的文件或文件夹
当然,如果删除的文件很多,且分布在不同文件夹里,使用这种方法显然不方便,那么可以使用方案二来实现。
解决方案二:
git add -A 或者 git add --all (-A是--all的简写)
运行git add -A 后,原来手动删除的文件在git中也被删除了。
5:如何撤销文件的暂存(staged)?
问题:
修改了两个文件并且想要将它们作为两次独立的修改提交,但却意外的输入了git add * 暂存了它们两个,如何从暂存中撤销其中一个?
解决办法:
使用git status命令,status命令告诉我们该怎么做可以unstaged (见红色字体)
git status
HEAD detached at 53fcf725
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: a.txt
new file: b.txt
使用git reset 撤销对a.txt的暂存
git reset HEAD a.txt
git status
HEAD detached at 53fcf725
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: b.txt
Untracked files:
(use "git add ..." to include in what will be committed)
a.txt
注意撤销文件的暂存只是把文件从暂存区踢出来,文件本身的修改并没有回退。
6:如何生成两个节点之间的patch
git format-patch commitidA..commitidB
7:如何忽略文件权限的可执行位
Linux系统代码克隆下来后,有些文件会做一下chmod 755 -R Code,修改源代码的文件权限属性。
但这时执行git status会发现这些文件变成了红色。
通常我们只关心文件内容的变更,因此chmod产生的变化应该忽略。
通过下面的配置,可以禁止Git对文件权限的跟踪。
git config core.fileMode false
在此模式下,当已添加到版本库中的文件其权限的可执行位改变时,该文件不会显示有改动。
8:如何回退本地修改未commit的文件至分支HEAD?
问题:
本地修改了某个文件,未做commit操作,想回退到分支上最新状态。
解决方法:
git status查看是否已经暂存,针对已经staged文件先unstaged
再执行命令 git checkout -- filename --舍弃unsatged的修改,重新从分支上checkout 文件覆盖到工作区,即实现恢复文件到分支最新。
9:Git如何恢复删除的文件
查看删除的文件: git ls-files --deleted
恢复则需要重新checkout:git checkout <deleted_file>
多文件同时操作可以使用xargs
git ls-files -d |xargs git checkout branch
10:如何设置只有包含非本人打分codereview +2代码才能合入库中
Gerrit 库在使用过程中存在评审单提交人自己code review通过就直接把代码合入库中,导致代码评审功能如同虚设的情况?
下面这个方法能解决此问题。
前提:做此设置的人需要有被配置的代码库的owner权限。
在父项目中(默认为All-Projects项目)将其添加到refs/meta/config分支中的project.config文件中:
[access "refs/*"]
l
label-Code-Review = block -2..+2 group Change Owner
并在同一分支的groups文件中添加此行
global:Change-Owner Change Owner
然后把允许权限的语句放到子项目的project.config中:
label-Code-Review = -2..+2 group Developers
11:为什么增加到.gitignore里甚至exclude里的过滤规则却没有生效?
曾经有同事遇到,将某个文件添加到.gitignore甚至添加到exclude文件里,但针对该文件的过滤规则却没有生效,配置的忽略其他文件的规则却是正常的。
经过仔细研究,原来是我们误解了.gitignore文件的用途,该文件只能作用于Untracked Files,也就是那些从来没有被git记录过的文件,之所以配置的ignore规则不生效,
是因为那个文件曾经被git记录过,因此.gitignore对此类文件完全无效。
不过可以通过如下命令,让git忽略该文件或该类文件的change。
git update-index --assume-unchanged filename
这样每次提交就不会出现命令中的文件了。
若在执行上述命令时出现
git update-index --assume-unchanged filename
fatal: Unable to mark file filename
解决方法:
1), git reset HEAD
2), 再次执行git update-index --assume-unchanged filename
12、将A库的分支移到 B库,并保留commit记录:
首先把A库下载,转到正确的分支;
然后:$ git remote add test ssh://ukanm005@172.29.169.30:29418/MCU/SmartSwitch/Platform
(test 是为 B库链接(ssh://ukanm005@172.29.169.30:29418/MCU/SmartSwitch/Platform)起的名字,不与remote同名即可。)
最后,将代码推送到 B库指定的分支: $ git push test Cypress_Microchip_Platform:Cypress_Microchip_Platform
(第一个Cypress_Microchip_Platform是A库的分支,第二个Cypress_Microchip_Platform是B库的分支;不需要在B库提前新建分支 Cypress_Microchip_Platform)
13、git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
在服务器添加完公钥后报错
sign_and_send_pubkey: signing failed: agent refused operation
这个时候我们只要执行下:
eval "$(ssh-agent -s)"
ssh-add