我工作中常用的git命令总结

安装环境:centos7.4

安装:

yum install git

初始化仓库:

git init

设置用户名:

git config --global user.name 'houger'

设置邮箱:

git config --global user.email'10001@qq.com'

设置颜色高亮 :

git config --global color.ui true

查看配置状态:

git config --list 

常用别名配置:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.st status

配置一个git last,让其显示最后一次提交信息:

git config --global alias.last 'log -1'

牛逼配置log,效果吊炸天:

git lg 查看commit记录

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

注:全局配置项文件在家目录 ~/.gitconfig

.gitignore文件:忽略某些文件时,需要在根目录编写.gitignore;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
示例如下:

.project
.settings
.idea
/public/assets/dist

克隆项目到本地:

git clone https://github.com/myfirst.git [-b branchname]

注意: window下可能报错:fatal:unable to access ‘: SSL certicate problem: unable to get local issuer certificate。这里通过设置git的ssl验证跳过了这个错误。
git config --global http.sslVerify false

关联一个 or 多个远程仓库 【origin :默认名】

git remote add [ github ] git@github.com:Jinmore/cfguanjia.git
git remote add  houger   git@github.com:houger/cfguanjia.git  

查看关联远程仓库:

git remote -v

删除远程仓库:

git remote rm [name]

项目管理:

  • 项目区域划分:工作区 -> 暂存区 -> 版本库 -> 远程版本库
  • 提交代码到暂存区:git add [filename] or . 代表所有文件
  • 暂存区到版本库 :git ci -m “文字说明”
  • 版本库到远程仓库:git push origin [master or dev 分支]
  • 查看当前状态 :git status
  • 查看版本提交记录:git log [ –pretty=oneline 一行显示] [–stat 列出文件的修改行数]
  • 查看操作记录:git reflog
#拉取分支,自动合并到当前分支
git pull [远程名] [分支名]

#获取分支到本地
git fetch [远程名] [本地分支]  

#从远程master分支获取最新,并在本地建立dev分支
git fetch origin master:dev  

#对比master 与dev分支
git diff dev      

#合并到主分支,配合fetch 使用
git merge origin/master      

比较文件的差异:

  • 工作区:git diff [ filename ]
  • 暂存区 :git diff --cached [ filename ]
  • 版本比较:git diff commit_id1 commit_id2 filename #查看两个版本filename的差异

注 :git diff HEAD 皆可查看工作区和缓冲区修改

撤回操作:

  1. 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout — file(工作区修改就用他);
  2. 文件提交到暂存区,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作;
  3. 已经提交了不合适的修改到版本库时,想要撤销本次提交 git reset –hard ID号;

关于分支:

git checkout -b dev  #-b 表示 创建并切换分支到dev
git branch           #创建分支
git checkout master  #切换到主分支
git branch           #查看当前分支
git merge dev        #把dev分支合并到master主分支
git branch   -d dev  #删除分支

git branch [-r 远端] [-a 全部]         #列出远程仓库分支
git push origin --delete branch_name  #删除远程分支

注:<如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除>
当提交分支冲突时,检查冲突文件,修改好之后,重新提交改文件即可

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分

支信息。准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:

git merge –no-ff -m “merge with no-ff” dev

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

开发场景分析: 如果在dev分支正在开发,暂时不能commit,但是maser 出现bug,此时需要把当前工作现场存储起来,修复完bug再继续,git stash 存储当前工作,然后切换到主分支git checkout master,拉取一个bug分支git checkout -b bug-101 ,在此分支上修复bug完之后提交。我们再切换到主分支git checkout master然后合并bug分支到master分支 : git merge –no-ff -m “修复bug合并到主分支” bug-101。最后我们在回到dev分支恢复工作状态:git checkout dev ,查看工作现场列表git stash list,恢复git stash apply,但是 stash 内容并不删除,需要 git stash drop 删除或者git stash pop 恢复的同时删除 stash。

可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash 用命令:git stash apply stash@{0}

多人工作模式分析:

  1. 首先在本地创建和远程分支对应的分支,使用git checkout -b branch-name [远程名:origin]/branch-name,本地和远程分支的名称最好一致
  2. 推送分支到远程服务器:git push origin branch-name
  3. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并 (*);
  4. 如果合并有冲突,则解决冲突,并在本地提交;
  5. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    [—-如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有关联,
    用命令git branch –set-upstream branch-name origin/branch-name关联 —-]

rebase 操作:

rebase命令的主要作用是:对commit记录进行编辑,删除,复制等操作;合理使用rebase可以使得我们提交记录

更干净、简洁。

  1. 合并多个commit为一个commit

我们在本地提交了三个commit为 a b c,为了让提交记录更简洁,我们希望将这三个记录合并为一个commit在

push到远程仓库,我们可以这样做:

git rebase -i [startcommitId]  [endcommitId]

git rebase -i HEAD~4   合并最近4次的提交记录

其中-i的意思是—interactive,即弹出交互式的界面让用户编辑完成合并操作,[startcommitId] [endcommitId]指定了一个编辑区间,如果不指定[endcommitId],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)

  1. 另一个场景:比如A和B同时从远程仓库获取最新分支,A和B同时对分支做了修改,A先提交了分支,这时B再

push是会失败的,不得不先pull,在本地合并后再push,这时通过git log –graph –pretty=oneline,看上去会很

乱,不是一条直线,这时rebase就派上用场了。

新建标签:git tag

用于新建一个标签,默认为HEAD,也可以指定一个commit id.

创建一个含附注类型的标签非常简单,用-a(译注:取 annotated 的首字母)指定标签名字即可, -m 选项则指

定了对应的标签说明 :

git tag -a v1.1 -m  "版本001号,由houger所编著"

签署标签:

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即

可。

git tag -s  -m  "版本002号" #可以用PGP签名标签;(用PGP签名的标签是不可伪造的,因为可以验证PGP签名)

git show v1.1    #命令查看相应标签的版本信息,并连同显示打标签时的提交对象

验证标签:

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来

验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证

删除本地标签:

git tag -d  tag_name

远程管理标签:

#将本地标签推送到服务器
git push origin tag_name  

#所有标签推送到服务器
git push origin --tags

#删除远程标签 or [ git push origin :refs/tags/tag_name ]
git push origin --delete tag_name  

#创建分支获取某个版本
git checkout -b branch_name  tag_name 

搭建git服务器:

  1. 创建一个git用户,用来运行git服务:
  2. 远端仓库初始化为bare(裸仓库),用户是不允许在仓库内进行各种git操作git init –bare server_name.git
  3. 把所有者改为git : chown -R git : git server_name.git
  4. 禁用shell登录: git:x:513:513::/home/git:/usr/bin/git-shell

管理公钥:/home/git/.ssh/authorized_keys

注意:通过ssh 传输,本地git仓库需要创建ssh key,查看用户目录下 .ssh目录下有没有id_rsa和id_rsa.pub这两

个文件。如果没有需创建:ssh-keygen -t rsa -C “youremail@example.com” ssh-copy-id -i ~/.ssh/id_rsa.pub

username@ip_address

用ssh-copy-id 把公钥复制到远程主机注:sshd 配置文件 /etc/ssh/sshd_config

其他相关操作:

#重命名远端
git remote rename [old_naem] [new_name]

#删除远端
git remote rm [远端别名]  

#更新分支列表
git remote update [远端别名]  

#删除(解除)已跟踪文件,本地文件保留
git rm --cached filename  

#解除所有已跟踪文件,即清空本地缓存区
git rm -r --cached .  

#显示最近一次提交版本差异 
git log -p -1             

发表评论

电子邮件地址不会被公开。 必填项已用*标注