git日常总结

  • 1.初次在本地下载分支代码操作
  • 2.初次下载远程代码
  • 3.创建分支
  • 3.1 创建本地分支
  • 3.2创建远程分支
  • 4. 删除分支
  • 4.1 删除本地分支
  • 4.2删除远程分支
  • 5. 删除文件
  • 5.1 删除本地文件
  • 5.2 删除远程文件
  • 6. 删除提交
  • 6.1 删除本地添加
  • 6.2 删除本地提交
  • 6.3 删除远程提交
  • 7. 合并分支
  • 8. .gitignore文件的作用与使用
  • 8.1 文件作用
  • 8.2 文件使用
  • 8.3 忽略文件的排除
  • 9.git 标签(tag)
  • 9.1 新建标签
  • 9.2 显示tag
  • 9.3 tag同步到远程
  • 9.4 切换tag
  • 9.5 删除tag
  • 10. 更改branch名字
  • 10.1 更改branch名字
  • 11. git token操作
  • 11.1 直接使用git token推代码(麻烦)
  • 11.2 修改远程仓库别名后使用git token推代码(简单)
  • 12. git cherry-pick操作
  • 13. git push缺少Change-Id
  • 13.1 最新提交缺少Change-Id
  • 13.2 历史提交缺少Change-Id
  • 14. git rebase
  • 14.1 经典用法,历史commit修改信息:
  • 14.2 经典用法,历史commit修改文件内容:
  • 14.3 git rebase 开发模式:
  • 15. git stash
  • 16. git lfs管理大文件
  • 16.1 环境准备
  • 16.2 添加大文件
  • 16.2.1 方式一:自动添加
  • 16.2.2 方式二: 命令行添加
  • 16.3检查用lfs管理的文件列表
  • 16.4 从云端拉取大文件
  • 17. 拉取远程新建分支


1.初次在本地下载分支代码操作

mikdir new_file_name
cd new_file_name
git init 
git pull [url] branch_name:local_branch_name

注意:此操作后,本地master也是远程 branch的内容,本地branch和远程master的内容也相同。

修改完代码后运行:

git add . //添加修改
git commit -m "test" //提交修改信息和备注
git tag git tag -a v1.4 -m 'version 1.4' //添加tag信息
git push [url] remote_branch_name //推向远程库 ,结束

2.初次下载远程代码

git clone <远程仓库地址>  //克隆master分支

或者:

git clone -b <指定分支名> <远程仓库地址>  //克隆指定分支

3.创建分支

3.1 创建本地分支

git checkout -b <分支名>  //创建本地分支前并切换到该分支

3.2创建远程分支

在完成3.1的基础上,运行以下命令即可创建远程分支

git push origin <分支名>  //将本地分支更新到远程分支上

4. 删除分支

4.1 删除本地分支

git checkout <其他分支>  //删除本地分支前先切换到其他分支
git branch -d  <目标本地分支名>  //删除目标本地分支

或者:

git checkout <其他分支>   //删除本地分支前先切换到其他分支
git branch -D  <目标本地分支名>  //强制删除目标本地分支

4.2删除远程分支

git branch -a \\查看所有本地分支和远程分支
git push origin --delete  <目标远程分支名>  //删除目标远程分支

5. 删除文件

5.1 删除本地文件

删除本地文件只需运行以下命令:

git rm <文件名> \\该命令会删除指定文件,也可用<*.后缀名>删除某一类型的文件

5.2 删除远程文件

在5.1的基础上,执行以下命令即可删除远程文件:

git commit -m "在本地提交本次删除" \\在本地提交本次删除
git push origin  master  \\将本地删除同步到远程仓库

6. 删除提交

6.1 删除本地添加

在执行命令“ git add .”后,若想曲线本操作,只需运行以下命令:

git reset . \\该命令会直接取消当前add

6.2 删除本地提交

常用命令:

git reset --hard [提交id] \\该命令会直接回退到某个版本,工作空间、缓冲区和本地仓库都会会退到上个版本

或者:

git reset --hard HEAD~n \\该命令会直接回退到n个版本以前,HEAD~1表示回退到上个版本,工作空间、缓冲区和本地仓库都会会退到上个版本

6.3 删除远程提交

在删除本地提交后,运行以下命令即可删除远程提交

git push origin --force  \\将本地代码强制push到远程仓库

或者:

git push -u origin master -f //将本地代码强制push到远程master分支

问题解决:
在强制push时,有时会遇到以下报错:

remote: GitLab: You are not allowed to force push code to a protected branch on this project.

这是因为分支为受保护的分支,而受保护的分支不允许强制推送,因此需要解除保护后重新推送,对于gitlab来说,解除保护需在gitlab上选择如下图橘黄色所示的“unprotect”,操作如下:

gitlab 如何打tag后自动release_远程仓库

7. 合并分支

问题描述:待合并分支为hotfixes(hotfixes 修改已提交到本地仓库和远程仓库), 目标分支为master,则合并命令为:

git checkout master // 切换到目标分支
git merge hotfixes //将hotfixes 分支merge到master分支
git push origin master // 将本队merge后的master 推送到远程分支

接下来的这一步视需要可选:

删除 本地仓库和远程仓库的hotfixes分支,操作步骤参见第4部分:删除分支

8. .gitignore文件的作用与使用

8.1 文件作用

.gitignore的作用是在提交代码时,忽略一些不需要提交的文件。

8.2 文件使用

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
常用的一些.gitignore模板见:github链接

8.3 忽略文件的排除

有的时候你要添加的文件和忽略规则是包含关系,就是你想要提交的某个文件属于忽略规则中的某一类,除了使用 -f参数( git add -f App.class)进行强行添加到版本库中外,还可以在文件中配置排除忽略某个文件,例如:
在.gitignore文件中配置了如下规则:

# 忽略所有.开头的隐藏文件:
.*
# 忽略所有.class文件:
*.class

但是我们发现.这个规则把.gitignore也排除了,并且App.class需要被添加到版本库,但是被.class规则排除了。此时可以在.gitignore中添加两条排除规则:

# 忽略所有.开头的隐藏文件:
.*
# 忽略所有.class文件:
*.class

# 排除忽略.gitignore和App.class:
!.gitignore
!App.class

把指定文件排除在.gitignore规则外的写法就是!文件名,所以,只需把例外文件添加进去即可。

9.git 标签(tag)

9.1 新建标签

git tag v1.0 //创建一个名为v1.0的tag

git tag -a tagName -m "my tag" //加上-a参数来创建一个带备注的tag,备注信息由-m指定。如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息

git tag -a v1.2 9fceb02 -m "my tag"  //给指定版本打tag

9.2 显示tag

git tag //列出已有tag
git tag -l "v1." //列出以v1.开头的所有tag
git show [tagname] //显示tagname的详细信息

9.3 tag同步到远程

git push origin --tags  //推送本地所有tag

git push origin v1.0   //推送指定tag

9.4 切换tag

git checkout [tagname]

9.5 删除tag

git tag -d [tagname]  //删除本地tag
git push origin :refs/tags/[tagname] //删除远程tag

10. 更改branch名字

10.1 更改branch名字

git checkout br_rename_old //切换到br_rename_old分支,如果已经在这个分支下,可以不执行此步骤
git pull origin br_rename_old //将代码更新到和远程仓库一致
git branch -m br_rename_old br_rename_new  //将本地仓库的br_rename_old的名称修改为br_rename_new
git push origin --delete br_rename_old  //将远程分支br_rename_old删除
git push --set-upstream origin br_rename_new  //将本地分支push到远程仓库

11. git token操作

11.1 直接使用git token推代码(麻烦)

# git push https://你的token@你的仓库链接,我这里是我的仓库链接你要改成你的
git push https://你的token@github.com/zackLiuzz/MY_Loam.git/

11.2 修改远程仓库别名后使用git token推代码(简单)

如果之前设置过远程仓库的别名,则:

# 我这里的别名是origin
# git remote set-url 你的remote别名 https://你的token@你的仓库地址
git remote set-url origin https://你的token@github.com/zackLiuzz/MY_Loam.git/
# 提交代码
git push -u origin master

如果未设置过远程仓库别名,则:

# git remote add 别名 https://你的token@你的仓库地址
git remote add origin https://你的token@github.com/zackLiuzz/MY_Loam.git/
# 提交代码
git push -u origin master

12. git cherry-pick操作

该操作用与将某一commit 添加到目标分支,并产生新的commit信息,例如

运行 git cherry-pick 前 分支为:

gitlab 如何打tag后自动release_git_02


运行以下命令后:

# 切换到 master 分支
$ git checkout master

# Cherry pick 操作
$ git cherry-pick f

分支变为:

gitlab 如何打tag后自动release_git_03


从上面可以看到,master分支的末尾增加了一个提交f。

13. git push缺少Change-Id

13.1 最新提交缺少Change-Id

直接运行:

git commit --amend

13.2 历史提交缺少Change-Id

git rebase -i ${commit id}  //回到历史commit
git commit --amend --no-edit //重新生成Change id
git rebase --cotinue  //回到最新提交

14. git rebase

git rebase 作用;Reapply commits on top of another base tip, 即在另一个基本提示上重新应用提交

14.1 经典用法,历史commit修改信息:

git rebase -i HEAD~2 // rebase到倒数第二个commit

然后将想更新的commit 前面的pick改为edit:

gitlab 如何打tag后自动release_远程分支_04

-------------------------->

gitlab 如何打tag后自动release_远程仓库_05

回车后运行以下命令重新编辑commit:

git commit --amend // 重新编辑commit信息
git rebase --continue // 回到最新提交

14.2 经典用法,历史commit修改文件内容:

git rebase -i ${历史commit_id -1} // 回退到某历史版本的上一个版本
// 操作: 将pick改为edit
// 操作: 修改文件 后运行 git add .
git commit --amend // 修改commit信息
git rebase --continue // 回到最新提交

14.3 git rebase 开发模式:

master分支:云端主开发分支
local分支:本地开发分支
现在基于local分支开发了一些内容,需要将其更新到云端master分支。

git checkout master && git pull //同步本地master分支
git checkout local && git rebase master //rebase到master最新提交
git checkout master && git merge local //将本地开发commit merge到本地master分支
git push origin master //将本地开发commit提交到云端master分支。

15. git stash

git stash save "name" //将当前修改保存到stash
git stash apply "name" //应用stash中的内容
git stash drop "name" //删除stash

16. git lfs管理大文件

16.1 环境准备

sudo apt-get install git-lfs // 安装git-lfs

16.2 添加大文件

16.2.1 方式一:自动添加

在.gitattributes中添加一下内容以追踪.tar.gz类型的大文件,以后每次运行git add 都会自动将.tar.gz类型的文件识别为需要用lfs管理的大文件

*.tart.gz filter=lfs diff=lfs merge=lfs -text
16.2.2 方式二: 命令行添加
git lfs track  // 查看现有的文件追踪模式
git lfs track *.gz // 添加要管理的大文件的文件类型,比如 ".gz" 文件,添加类型后,可以发现 .gitattributes 文件中新增加一行:*.gz filter=lfs diff=lfs merge=lfs -text

16.3检查用lfs管理的文件列表

git lfs ls-files

16.4 从云端拉取大文件

git lfs fetch
git lfs pull

17. 拉取远程新建分支

git fetch origin develop(develop为远程仓库的分支名) //将远程分支拉到本地
git chekcout -b dev(本地分支名称) origin/develop(远程分支名称) // 在本地创建分支dev并切换到该分支
git pull origin develop(远程分支名称) // 把远程分支上的内容拉取到本地

原理参考:https://blog.51cto.com/u_14301180/5354240

本文介绍了 10 个常见的命令以及它们的一些参数。每个命令都可以链接到该命令的 Atlassian Bitbucket 指南。

检查

先了解一下如何检查改动痕迹。

git diff——查看所有本地文件的改动。只改动一个文件的话可以在命令后添加文件名。

git log——查看所有提交历史。还可用于带有 git log –p my_file 的文件,输入 q 退出。

git blame my file——了解谁在什么时候对 my_file 做了什么样的改动。

gitreflog——显示本地代码库 HEAD 的更改日志。这个命令很适合查找丢失的工作。

用 Git 进行检查并不麻烦。相比之下,Git 中有不少删除和撤销提交以及文件改动的操作。

撤销

可以用 git reset、git checkout 和 git revert 撤销在代码库中所做的改动,这些命令可能有点难理解。

git reset 和 git checkout 既可用于提交也可用于单个文件的修改,而 git revert 只能用在提交层面。如果你只需要处理尚未合并到协作远程工作的本地提交,你可以使用这三者中任何一条命令。如果是协同工作且需要撤销远程分支中的提交,那么就用 git revert。

这些命令中的每一条都有多个参数。以下是常见的用法:

git reset –-hard HEAD——撤销最近提交以来暂存区和非暂存区的改动。

指定不同的提交而不是 HEAD,以撤销自这条提交以来的更改。–hard 指的是撤销暂存区和非暂存区的更改。

要确保你撤销的不是协作伙伴所依赖的远程分支的提交。

git checkout my commit——从 my_commit 中撤销非暂存区的改动。

HEAD 常用在 my_commit,用来撤销最近一次提交以来在本地工作目录的改动。

checkout 最适合用于仅限于本地的撤销。它不会破坏你的协作伙伴所依赖的远程分支的提交历史。

如果你将 checkout 用在分支而不是提交上,HEAD 将会切换到指定分支,并更新成匹配的工作目录。这是 checkout 命令更常见的用法。

Git revert my commit——撤销 my_commit 中的更改。当用 revert 撤销改动时,它会产生新的提交。

对协作项目而言,revert 是很安全的,因为它不会覆盖其他用户分支可能依赖的历史记录。

revert 很安全。

有时候你只想删除本地目录中的未追踪文件。例如,也许你运行的代码在版本库中创建了许多你不需要的不同类型的文件。你可以一键清除它们!

Git clean –n——删除本地工作目录中的未追踪文件。

–n 表示试运行,在试运行中什么都不会删除。

-f 表示实际删除文件。

-d 表示删除未追踪的目录。

默认情况下不会删除 .gitignore 中的未追踪文件,但这种行为是可以更改的。

现在你已经知道了 Git 中用于撤销操作的命令,接下来我们再看两条可以有序排列文件的命令。

整理

Git commit –amend——将暂存区的更改添加到最近一次提交中。

如果暂存区中什么都没有,你可以用该命令编辑最新的提交信息。只有在提交尚未整合到远程主分支中时才使用该命令!

Git push my remote –tags——将所有本地标记发送到远程版本库中。适用于版本变更。

如果你用的是 Python,并希望更改你所构建的包,bump2version 会自动为你创建标签。一旦将标签推送出去,你就可以在自己的版本中使用了。这里有一篇我的指南,可以指导你完成第一个 OSS Python 包。跟紧我,确保你不会错过版本控制的部分!

求助,我被困在 Vim 中出不去了!

使用 Git 时,你可能偶尔会发现自己被困在 Vim 会话中了。例如,你试着在没有提交信息的情况下提交,Vim 会自动开启。如果你不知道 Vim 的话,这种情况糟糕透了——在这个关于如何摆脱这一困境的 Stack Overflow 回答下有超过 4,000 的投票。

以下四步用于在已保存的文件中逃离 Vim:

1.按 i 进入插入模式

2.在第一行输入你的提交信息

3.按下退出键——Esc

4.输入 :x。别忘了冒号(colon)。

更改默认编辑器

为了避免使用 Vim,可以更改 Git 中的默认编辑器。以下是更改我使用的编辑器 Atom 的默认值的命令:

git config --global core.editor “atom --wait”

假设你已经安装了 Atom,你现在就可以在 Atom 中解决 Git 问题了。