openks / learn-vue

自定义组件文档
https://openks.github.io/learn-vue
0 stars 0 forks source link

20161117_git常用命令 #67

Open openks opened 6 years ago

openks commented 6 years ago

title: git常用命令
date: 2016-11-17 13:21:35
description: git常用命令记录
keywords: [前端,git,git命令]

git log 命令

git log -n

显示前N条日志

git log --stat -n

显示简要的增改行数统计,每次提交文件的变更统计

git log --pretty=format:" "

选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
git log --pretty=format:" %s" -3
test:add new question add question6
test:add new question add question5
test:add new question
//命令好用,起个别名
git config alias.logs "log --pretty=format:'%s'"
// 以后就可以使用如下命令,命令结果和上面一条命令结果一样
git logs -3
// 某些文件或某个文件的最近3次记录
git logs -3  static/*.html
// 指定作者为"BeginMan"的所有提交
git log --author=BeginMan
// 指定关键字为“init”的所有提交
git log --grep=init
// 指定提交者为"Jack"的所有提交
git log --committer=Jack

//查看文件的修改记录 可以看到提交版本
git log demo/js/propagation.js
commit bdbcf6226b05207fc4d4a6b56ab566ff0744295e
//回退到指定版本
git reset bdbcf6226b05207fc4d4a6b56ab566ff0744295e demo/js/propagation.js

git Commit message

Commit message 都包括三个部分:Header,Body 和 Footer。

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)

type 意义
feat 新功能(feature)
fix 修补bug
docs 文档(documentation)
style 格式(不影响代码运行的变动)
refactor 重构(即不是新增功能,也不是修改bug的代码变动)
test 增加测试
chore 构建过程或辅助工具的变动

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

subject是 commit 目的的简短描述,不超过50个字符。

以动词开头,使用第一人称现在时,比如change,而不是changed或changes
第一个字母小写
结尾不加句号(.)

总结:commit message应包含type+":"+subject

git issues

// 关闭一个
Closes #234
// 关闭多个issue
Closes #123, #245, #992

git branch

查看所有分支(前面带*号的代表你当前工作目录所处的分支)
git branch -a  

创建test分支
git branch test  

切换到test分支
git checkout test  

删除本地test分支
git branch -d test

删除远程test分支
git push origin --delete test

合并分支(把test分支合并到master分支上)
git checkout master
git merge test

把当前test分支提交到远程test分支
git push origin test

把本地所有分支提交到远程相对应的分支上
git push

//复制代码库到本地
git clone http://192.168.1.231/group-two/jujusports-web.git

//添加所有未添加的文件
git add .

//查看版本区别只显示文件名字
git diff --name-only

//git 查看某版本文件
//git show 版本号 文件名
git show 33e636914bf61536fe56d3872338f0087c1a1e5c static/order_undone.html

//刚创建git需要添加分支
git push -u origin master

//git撤销用branch上代码覆盖本地仓库及本地工程
git checkout routes/index.js

git reset [--hard|soft|mixed|merge|keep]
/*
[<commit>或HEAD]:将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。mode的取值可以是hard、soft、mixed、merged、keep。下面来详细说明每种模式的意义和效果。
A). --hard:重设(reset) index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>。
B). --soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中。
C).  --mixed:仅reset index,但是不reset working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成"Changes to be committed",但是会打出什么还未被更新的报告。报告如下:
引用
Unstaged changes after reset:
M Test.Scala
M test.txt
*/

git config

git config --global user.name  openks
git config --global user.email  zhuyangxing@foxmail.com
//显示所有配置
git config --list
//保存git的用户名密码
git config --global credential.helper store

git提交流程

为了保持提交记录的干净

// 从服务器拉代码
git pull
// 本地修改1
git commit -am "c1"
// 本地修改2
git commit -am "c2"
// 本地修改3
git commit -am "c3"
// 1,2,3修改为一个功能先合并提交 
// 即本地rebase
git rebase -i 
git rebase -i SHA1
git rebase -i HEAD~5
// 弹出编辑框 点击insert进入编辑模式
// 保留第一个pick 
//其他的pick改为s  即把这次提交合并到前一次提交
// 然后esc :wq
// 然后从远程服务器拉代码 建议pull时添加参数--rebase  
git pull --rebase 
//  如果不冲突则最好 直接push到服务器
git push
// 如果冲突则merage合并冲突
git add .
git commit -am "合并"
// 再次rebase 重新合并代码
git rebase 
// 然后再push到服务器 
git push  

git仓库备份

需求很简单
oschina上做主要的代码,在coding做代码备份

  1. 首先在oschinacoding上分别创建项目test_git_mirroe
  2. oschinaclone代码git clone https://git.oschina.net/openks/test_git_mirroe.git
  3. 跳转到项目目录cd test_git_mirroe
  4. 添加coding的远程仓库git remote add coding https://git.coding.net/zhuyangxing/test_git_mirroe.git
  5. 提交coding做镜像代码git push --mirror coding
  6. 以后在test_git_mirroe上提交的代码都提交到oschina
  7. 想要在coding上同步就执行git push --mirror coding即可

git一次提交到两个仓库

修改.git文件夹下的config文件
fetch下添加想要提交的其他git路径即可

[remote "origin"]
    url = https://git.oschina.net/openks/test_git_mirroe.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = new git url

git 文件对比

方法一:还是我最常用的命令行

git diff <commitA> <commitB> filename

方法二:在gitlab上对比查看

输入两个提交版本,会显示所有文件的版本差异相同的则不显示,具体如下图 image

再上一张我没找到问题的文件对比图,这确实是什么都没改啊(加了class这个除外) image

git Tag

# 创建tag
git tag tagName -m "这里是tag相关信息"
# 创建安全tag 别人无法修改并覆盖该tag确保该tag是认证安全版本 建议使用
git tag -s tagName -m "这里是tag相关信息" 
# 如果上面方法报错则使用下面方法
git tag -u 这里是gpg用户名 tagName -m "这里是tag相关信息"
# 查看tag 
# -l 显示tag名 
# -n 显示message
git tag -l -n 
# 删除Tag
git tag -d tagName
# 删除远程tag
git push origin --delete tag tagName
# 将本地所有标签一次性提交到git服务器
git push origin –-tags 
# 查看项目的tag验证信息
git tag -v v1.0

关于GPG

# 生成GPG Key 根据提示选择加密方法 并输入相关信息即可
gpg --gen-key
# 验证GPG Key是否生成成功
gpg --list-keys
# 上边显示的是公钥,顺便也看一下与之匹配的私钥生成如何:
gpg --list-secret-keys
# 然后就可以使用gpg加密你的tag了

git patch

git中的patch有两种:
一是用git diff生成的标准patch
二是用git format-patch生成的Git专用Patch
git format-patch生成的patch在文件的前面会有diff的信息,还有提交者,时间等等

# 使用git diff 生成patch (不建议)
git diff SHA1 > a.patch
# 先检查patch文件
git apply --stat a.patch
# 检查能否应用成功 
git apply --check a.patch
# 打补丁
git apply a.patch
patch p1 < a.patch 
# 使用git format-patch 生成patc 建议)
git format-patch SHA1 > a.patch
# 先检查patch文件
git apply --stat a.patch
# 检查能否应用成功 
git apply --check a.patch
# 打补丁 
# git am 必须使用的是用git format-patch 生成的patch文件来打补丁,
# 而不能是使用git diff生成的patch
# 使用-s或--signoff选项,可以commit信息中加入Signed-off-by信息
git am --signoff < a.patch

有道分享

openks commented 6 years ago

add 2018-01-17 10:42:13

把gitbash的编辑器设置为其他文本编辑器

git vim在rebase时经常崩溃并报如下错误 git rebase vim Caught deadly signal SEGV解决方案: 设置git的编辑器为notepad++(修改完后需关闭整个notepad++才可继续)

git config --global core.editor \ "'C:/Program Files (x86)/Notepad++/notepad++.exe'”
openks commented 6 years ago

add 2018-02-09 15:12:25

如何查看某次提交修改的文件有哪些

# 查看从sha1开始最近 n次的提交改动了那些文件
# 每个文件加了几行减了几行
# git log sha1 --stat -n
git log 0a79d5f811403766e05a9ca906a463de5e85c957 --stat -1

以图表格式显示提交记录

#以图表方式查看各分支之间的关系
git log --graph --oneline

比对最近几次已经commit代码改动内容

# 想查看几次就在head后面该为几
git diff head~1
# 查看两次之间改动内容 也可以用sha1值
git diff head~1 head~3
openks commented 6 years ago

add 2018-04-17 15:41:35

git 创建空分支

# 创建独立分支
git checkout --orphan branchName
# 移除原分支相关的所有文件
git rm -rf .
# 添加文件并提交 新增文件需要用add 
git add . 
git commit -am "new branch init"
openks commented 6 years ago

add 2018-04-27 14:59:27

git bash commit 换行解决方案

用习惯了git commit -am 'messgae' 发现描述信息换行非常不方便,经网上寻找解决办法后发现用模板文件可以轻松解决,这个也简单,只需要两步涉及即可

1.设置默认编辑器 2.设置模板文件

# 设置默认编辑器  我在win上用nodepad++
git config --global core.editor 'C:\Nodepad++\Nodepad++.exe'
#  设置模板文件 模板文件位置可以随便设置 我这里就在根目录下面
git config --global commit.template ~/.gitmessage.txt
# 下次提交时只需 就会打开Nodepad++编辑器
git commit -a 

模板文件内容如下(也可根据自己需要随时调整)

# Type(<scope>): <subject>

# <body>

# <footer>

# type 字段包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
# scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等。
# subject是 commit 目的的简短描述,不超过50个字符
# Body 部分是对本次 commit 的详细描述,可以分成多行
# Footer用来关闭 Issue或以BREAKING CHANGE开头,后面是对变动的描述、
#       以及变动理由和迁移方法

# 英文版详细例子,请看这里
# https://github.com/sparkbox/how_to/tree/master/style/git
# 中文版介绍,请看这里
# http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

更多信息可查看相关官方文档

openks commented 6 years ago

GIT分支替换

# 目的:用dev分支替换master分支内容
# 切换到master分支
git checkout master 
# 先将本地的master分支重置成dev
git reset --hard dev
#  再强制推送到远程仓库
git push  --force
openks commented 6 years ago

GIT常用的三种情况

1. 我需要修改最近一次的提交

最近一次提交最简单

git add . 
git commit -am "add something even nothing"
git rebase -i head~2 
# change the last "pick" to "squash"
# 由于修改了最后一次提交内容需强制推送到远程分支 
git push --force-with-lease

2.修改中间的某一次操作

你有一个文件(不包含斜杠后内容)如下分别有3次提交每次一行:

this is the first line  //this is commit 1 sha1
this is the seconds line  //this is commit 2 sha2
this is the third line  //this is commit 3 sha3

如果你想修改第二次提交把seconds该为second

git rebase -i sha1 
# change files
# 把seconds该为second
git add .
git commit --amend
git rebase --continue
# 这里会有冲突,因为commit3 是建立在commit 2的基础上
# 虽说commit 2改动了内容发生变化(变为改动后内容)
# 但commit 3的内容不变(依旧是改动前内容)

结论 :只有你要修改的文件在要修改提交版本(本例为commit 1)和最终版本(本例为commit 3) 之间没有改动才不会出现冲突,否则只有依次解决所有之后提交的冲突

3.某个功能有过多无意义的提交记录,重新开始

在该分支上rebase开发主分支

# 把开发分支上的代码都合并到你自己分支上
git checkout feature-a
git rebase dev
# 导出补丁
git diff dev feature-a > feature-a.patch
git checkout dev
# 创建新分支
git checkout -b feature-a-new
# 把补丁打到新分支上
git apply feature-a.patch
# 确保一切正常后删除原分支(没有合并需强制删除)
git branch -D feature-a
openks commented 6 years ago

git 中查看某个文件是什么时候被删除的

git log -- [file_path]

# limit the output of Git log to the 
# last commit, i.e. the commit which delete the file
# -1 to see only the last commit
# use 2 to see the last 2 commits etc
git log -1 -- [file_path]

# include stat parameter to see
# some statics, e.g., how many files were 
# deleted
git log -1 --stat -- [file_path] 

详见这里

openks commented 6 years ago

如何在 git 里查找哪一个 commit 删除了代码的一行

git log -S <string> path/to/file

http://stackoverflow.com/questions/4404444/how-do-i-blame-a-deleted-line