Git常用命令

本文主要根据项目开展过程,对一些常用的git命令进行记录。

 

一.从服务器获取仓库与同步

 1.1 克隆仓库

git clone [remote path]

 2.1 同步修改

常用以下命令,避免本地数据被修改:

git fetch

如果远程有删除的分支,则需要使用以下命令

git fetch -p

如果需要同步全部tag信息,则使用以下命令

git fetch --tags

 

二.本地修改提交

2.1 分支相关

新建分支:

git branch [branch]

切换分支

git checkout [branch]

新建并切换到对应分支:

git checkout -b [branch]

 在某源分支新建并强制切换到该分支:

git checkout -B [new branch] [source branch]

2.2 本地提交

加入暂存区:

git add [filepath]

filepath可以是路径,也可以是多个文件

暂存区提交到本地版本库:

git commit -m "commit message"

提交的注释需要换行,则使用单引号解决,如:
git commit -m '(回车后输入注释信息,然后以单引号结束)
comment...
'

 未加入版本管理的文件需要先add,再commit。所有文件都加入了版本管理,单纯涉及文件修改,只需要一步到位:

git commit -a -m "commit message"  //提交所有文件
git commit [filepath] -m
"commit message"  //提交多个文件

覆盖上一次提交(commit):

git commit –-amend

2.3 本地修改与恢复

git reset 重置:

(1)git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

(2)git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

(3)git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容(这个要特别注意,因为本地代码会修改)

1.回退所有内容到上一个版本(本地修改代码不变)
git reset HEAD^ 

2.回退a 这个文件的版本到上一个版本(本地修改代码不变) git reset HEAD^ a
3.将本地的状态回退到上个版本(本地修改丢失) git reset --hard HEAD^
4.将本地的状态回退到和远程的一样 git reset –hard origin/master

 撤销单个未提交的修改:

git checkout file-name
比如修改的都是java文件,不必一个个撤销,可以使用
$ git checkout *.java

撤销所有本地未提交的修改:

git checkout .(目录)

从远程仓库抓取数据:

git fetch
eg. git fetch origin

 

2.4 Tag相关

新建tag:

创建带有说明的标签,用-a指定标签名,-m指定说明文字

git tag -a [tag] -m [info]

eg: git tag -a v0.1 -m "version 0.1 released push url"

查看tag:

git show [tag name]

 

三.推送及远程服务器操作

推送本地修改,也可以推送新建的分支:

git push [server] [branch-name]
eg. git push origin master(or other (new)branch)

 

推送分支:

运行 git push origin serverfix:serferfix,它的意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为serverfix 分支,当然也可以改其他名字,这个用法就类似于在windows下图形界面的提交了。

git push [server] [local branch name]:[remote branch name]

 

推送单个tag:

git push origin [tagname]

 

删除远程分支:

git push origin --delete [BranchName]
or
git push [server] [null]:[remote branch] 这边省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”,即删除了对应的远程分支,比如删除远程分支serverfix可以这么做: git push origin :serverfix

 

四、Git技巧

4.1 git提交空目录

git中,对于空目录是不纳入版本管理的,所以git在提交时,若是存在空目录,则会被忽略上传。

如果从服务器取出,A目录下有文件,本次提交,A目录下文件删除了,那此时提交上去,则会把该目录删除,下次从服务器取出就不会有该目录了。

那么应该如何提交空目录呢?答案就是让它不成为空目录,可以在该目录下新建'.gitignore'文件,或者'.gitkeep'文件,后续自己开发时,把该文件批量删除即可。

附上检测空目录并新建文件命令:

find /temp/ -type d -empty -exec touch {}/.gitkeep \;
# 在temp目录下寻找所有空目录并在空目录里新建.gitkeep文件

检测同名文件并删除命令:

find ./temp/ -name '*.gitkeep' -type f -print -exec rm -rf {} \;
# 删除temp目录下所有的.gitkeep文件

 

4.2 使gitignore文件立即生效

# 有时候需要突然修改 .gitignore 文件,随后要立即生效

git rm -r --cached .  #清除缓存  
git add . #重新trace file  
git commit -m "update .gitignore" #提交和注释  
git push origin master #可选,如果需要同步到remote上的话  

 

4.3 Git patch-未验证

git format-patch -s 4e16 // 某次提交以后的所有patch, --4e16指的是SHA1 ID, -s : signed off

git format-patch -1 // 单次提交

git format-patch -3 // 从head往前3个提交的内容,可修改为你想要的数值

git format-patch –n 07fe // -n指patch数,07fe对应提交的名称, 某次提交(含)之前的几次提交

git format-patch -1 commit-id // + commit-id 选定的那个commit打patch

 

4.4 git删除已经提交的不必要的文件

参考自:https://www.cnblogs.com/vertextao/p/6584503.html

如果是少量的小文件,通常不必做什么,正常删除即可。但是如果不小心提交了不必要大文件,或者非常多的小文件,导致整个git仓库的大小变得难以接受,这时候就需要做清理工作。

注意:无论如何,请先做好备份,避免误操作导致自己的作品丢失!

简单粗暴的方法

如果你有一份远程仓库

  • 需要保留的文件复制出来一份
  • 删除整个本地仓库
  • 从远程仓库重新 git clone 一份下来
  • 把第一步复制出来的文件覆盖进去,再提交

如果你在本地已经有多次提交并且没有做git push,会使得这部分提交记录丢失,但是留住了最新版本+已经push到远程的版本!

优雅的方法(有点复杂)

如果你很清楚要移除那些文件

  • 删除并重写提交记录

    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch xxx'

    其中xxx填写你要删除的文件名,当然也支持通配符,如:*.tar.gz 匹配所有的后缀名为 tar.gz 压缩包。

  • 删除引用
    rm -rf .git/refs/original/ rm -rf .git/logs/
  • 垃圾回收并清理

    git gc 
    git prune --expire now

如果你不知道是哪个文件占用那么大空间(比如这个文件已经在当前版本被删除了,但是历史版本里存在),请参考文档:Git 内部原理 - 维护、清理及数据恢复:https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E7%BB%B4%E6%8A%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D

 

posted on 2018-08-11 11:25  darpanda  阅读(150)  评论(0)    收藏  举报

导航