Git常用命令

初始化

git init

git add filename

git commit -m "xxx"

查看log

git log查看历史记录, 显示从最近到最远的提交日志
$ git log --pretty=oneline

回退

在Git中,用HEAD表示当前版本,也就是最新的提交
上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100
$ git reset --hard HEAD^回退到上一个版本
$ git reset --hard 1094a使用版本序号回退

撤销修改

现在假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了:
庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:
Git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把stupid boss提交推送到远程版本库,你就真的惨了……

比较两个分支文件的异同

git diff branch1 branch2 [--stat]

分支管理

创建分支

$ git checkout -b dev

分支合并

有两个分支,两个都不是主分支
一个是for_xxx, 另一个是dev
在dev分支开发新的功能,for_xxx保持稳定
在dev上commit&push之后,如果想合并到for_xxx;
可以先checkout到for_xxx,在这个分支下$ git merge dev
合并之后要在for_xxx分支上push一下
这样采用的是fast-forward模式进行合并

合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev

解决冲突

人生不如意之事十之八九,合并分支往往也不是一帆风顺的。(在分支上修改add+commit之后, 回到master又进行修改)
现在,master分支和feature1分支各自都分别有新的提交,变成了这样
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,
,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
此时可以cat <file>查看冲突
手动修改, 直接在文件里修改
合并冲突解决后再删除分支
git branch -d <branch>
用git log --graph命令可以看到分支合并图。`

删除分支

删除本地分支

$git branch -D branch_name
-D == -delete

删除本地分支的远程分支

git branch -r -D origin/BranchName

删除git服务器上的分支:

git push origin -d BranchName

cherry-pick

先cd到 ~/.local/lib/python3.5/site-packages

$ vim acuitylib/converter/caffeloader.py

~/.local/lib/python3.5/site-packages$ patch –p1 < /vip_data_center/test_envs/acuity_trainer/backup/4a26ea2.diff

显示Hunk #1 succeeded at 981(offset 1 line)就算成功了

gitignore

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览: https://github.com/github/gitignore

忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

远程仓库

创建ssh key
>$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

使用,添加远程库

在github上创建一个空的新库

在本地的learngit仓库下运行命令:
$git remote add origin https://github.com/xxx
若报错
$ git remote rm origin
再执行上一句

git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

Linux gerrit clone时不需要输入密码

选用ssh克隆方式,而不是http

将远程服务器代码更新到本地

git fetch origin dev
git reset --hard FETCH_HEAD

git pull 取回远程主机某个分支的更新,再与本地的指定分支合并。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中

git pull <远程主机名> <远程分支名>:<本地分支名>

e.g.要取回origin主机的next分支,与本地的master分支合并,使用git pull origin next:master

如果是远程分支与当前分支合并,则可省略冒号部分,使用git pull origin next

其实就相当于

git fetch origin
git merge origin/next
posted @ 2019-04-09 10:20  开心大人  阅读(226)  评论(0编辑  收藏  举报