Git 命令

本文详述了Git的基本操作,包括配置用户名和邮箱、版本库创建、时光穿梭、分支管理、远程仓库操作、多人协作流程以及标签管理。重点介绍了如何在不同场景下使用git checkout、git merge、git rebase等命令,以及如何处理bug分支和feature分支。此外,还提到了GitHub的使用和自定义配置,以及搭建Git服务器的步骤。内容覆盖了Git的日常使用和团队协作策略。
摘要由CSDN通过智能技术生成

Git 命令

配置用户名和邮箱配置

全局配置
> $ git config --global user.name “github’s Name”
> $ git config --global user.email “github@xx.com”

单独配置
> $ git config user.name “gitlab’s Name”
> $ git config user.email “gitlab@xx.com”

1.版本库创建

  • 创建本地版本库 > git init(在一个空白目录执行)

2.时光穿梭机

  • 查看当前仓库状态 > git status
  • 查看某个文件的difference > git diff fileName
  • 提交修改到暂存区 > git add ./fileName (. 表示所有修改文件提交;fileName 表示某个文件进行提交)
  • 暂存区的所有内容提交到当前分支 > git commit -m “” (引号里面是你的介绍,就是你的这次的提交是什么内容)
  • 查看历史commit数据 > git log --pretty=oneline (–pretty=oneline 简化历史信息)
  • 查看分支合并情况 > git log --graph --pretty=oneline --abbrev-commit
  • 回退到上一个版本 > git reset --hard HEAD^( 几个^表示回退几个版本,多的话可以写成HEAD~100,表示回退100个版本)
  • 回退到指定的一个commit ID 版本 > git reset --hard commitId (commitId 回退版本的iD)
  • 查看Git历史执行命令记录 > git reflog
  • 丢弃工作区的修改 > git checkout – fileName (回到最近一次git commit或git add时的状态。)
  • 把暂存区的修改撤销 > git reset HEAD fileName
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

  • 删除文件 > git re fileName (删除后需要git commit;删除错误可以通过 git checkout – fileName 恢复误删)

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

3.远程仓库

使用  ssh-keygen -t rsa -C "youremail@example.com" 生产SSH key并在github添加
  • 本地仓库关联远程仓库(github创建) > git remote add origin git@github.com:yourname/learngit.git (yourname 你的github账号名,learngit 你的仓库名)
  • 将本地仓库内容推送到远程仓库 > git push -u origin master (-u参数不但推送,而且将本地的分支和远程的分支关联起来 ,origin 远程仓库名;master 本地分支名)
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
小结:
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
  • 克隆远程仓库 > git clone git@github.com:yourname/learngit.git

分支管理

  • 创建并切换分支 > git checkout -b dev (dev 分支名)
  • 创建分支 > git branch dev (dev 分支名)
  • 切换分支 > giy checkout dev (dev 分支名)
  • 查看当前分支 > git branch

git branch命令会列出所有分支,当前分支前面会标一个*号。

  • 合并分支 > git merge dev (dev 分支名;git merge命令用于合并指定分支到当前分支)
  • 合并分支 > git merge --no-ff -m “merge with no-ff” dev(–no-ff参数,表示禁用Fast forward ;-m参数,commit)
  • 删除分支 > git branch -d dev (dev 分支名)
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

bug 分支处理

  • 当前分支工作未完成,要先修复一个分支下的bug > git stash 把当前工作区域“存储”起来
  • 查看工作区列表 > git stash list
  • 恢复工作区 >git stash apply/pop (apply恢复后,stash内容并不删除,你需要用git stash drop来删除;pop恢复的同时把stash内容也删了)
  • 指定回复那个工作区 > git stash apply stash@{0}

feature 分支

接到了一个新任务:开发代号为Vulcan的新功能
git checkout -b feature-vulcan 
创建一个分支进行合并,由于各种原因需要删除feature分支
由于分支未合并,需要-D删除 > git branch -D feature-vulcan

多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
  • 查看远程仓库 > git remote -v(-v 查看详细信息)
git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
推送
默认情况下,只能看到本地的master分支。不信可以用git branch命令看看:
git checkout -b dev origin/dev 创建远程origin的dev分支到本地
  • 拉去远程仓库最新代码 > git pull

git branch --set-upstream-to=origin/ dev 指定本地dev分支与远程origin/dev分支的链接

因此,多人协作的工作模式通常是这样:

首先,可以试图用git push origin <branch-name>推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

小结
查看远程库信息,使用git remote -v;

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase

git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

标签管理

  • 创建标签 > git tag [name]
  • 查看标签 > git tag 默认标签是打在最新提交的commit上的
  • 给某个commit id打标签 > git tag [name] [commit id]
  • 查看标签信息 > git show [name]
  • 给标签说明 > git tag -a [name] -m “version 0.1 released” [commit id] (用-a指定标签名,-m指定说明文字:)
  • 删除标签 > git tag -d [name]
  • 推送某个标签到远程 > git push origin [name]
  • 推送所以标签到远程 > git push origin --tags
要删除远程标签 首先删除本地标签
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

github的使用

  • 克隆一个远程仓库 > git clone git@github.com:[your name]/[name].git

自定义配置

  • 强制添加忽略的文件 > git add -f [filename]
  • 检查.gitignore写得有问题 > git check-ignore -v [filename]
  • 配置别名 > git config --global alias.[aliasname] “status”
git config --global alias.co checkout  > git co dev
git config --global alias.ci commit    > git ci -m "xxx"
git config --global alias.br branch	   > git br dev
也可直接修改配置文件.git/config
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
假设你已经有sudo权限的用户账号,下面,正式开始安装。

第一步,安装git:
$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:
$ sudo adduser git

第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git

第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。

管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值