Git 基础命令

前言:
跟随大神脚步,廖雪峰 Git 教程
学好Git,早日掌握代码托管利器

环境与版本库

环境

安装

windows版本 Git
打包好的模拟环境及git: msysgit

验证

开始菜单,Git–Git Bash

配置

命令:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

说明:

git config –global 参数表示当前机器所有用户都是使用该配置

版本库

进入版本库 :cd e:/learngit

1.创建版本库(仓库)

选择合适位置创建空目录,Windows环境要确保路径不包含中文:

进入目标盘符

命令:cd e:/

确认进入,查看文件

命令:ls

创建仓库

命令:
mkdir <repo-name>
cd <repo-name>

pwd
显示为:/路径/

注:pwd显示当前目录路径

2.将空目录变成Git可以管理的仓库

命令:git init
提示:Initialized empty Git repository in /路径//.git/
.git目录:Git用来跟踪管理版本库,勿动;默认隐藏, ls -ah查看路径

3.将文件添加提交到仓库,无提示即为成功

注:文件放入仓库目录,否则Git无法找到
命令:

git add <file>
作用:添加文件到仓库

命令:

git commit -m "infomation"
作用:将文件提交到仓库

注:-m后必须跟随本次提交的说明,否则将无法继续操作!!!!

扩展:

1.add <file> 可反复使用,添加多个文件

commit可以一次提交很多文件
如: git add file1.java
git add file2.xml
git add flie3.png
……
git commit -m “add many files”

2.add.:提交当前工作区未被配置为忽略的所有文件到暂存区(更喜欢存储区这个称呼)

状态

命令:git status

作用:时刻掌握仓库当期状态

diff信息

命令:git diff

作用:查看difference,以unix通用diff格式显示

历史记录

命令:git log

作用:查看提交历史,从最近到最远,可确定回退版本,会进入log界面

扩展:git log --pretty=oneline

–pretty==oneline 单行显示重要信息,包含:commit-id ,commit information

版本号commit id HASH值 以16进制表示

版本回退

命令:git reset --hard HEAD^

作用:回退到上一个版本

注:HEAD指向当前版本 HEAD^上个版本 HEAD^^上两个版本,上100个版本 HEAD~100

命令: git reset --hard commit-id

作用:回退到指定版本:

注:id不需要写全,也不要太短,git会自动查找

命令:cat <file>
作用:查看文件

查看命令历史

命令: git reflog

作用:查看命令历史,可用于查看commit-id及HEAD版本, 用于版本回退

工作区与暂存区

一些简单说明

工作区包含隐藏目录.git ,是Git版本库

创建版本库时,Git默认创建第一个分支master,并包含暂存区stage

git add <file>:添加文件,实际上是将文件修改添加到暂存区

git commit <file>:提交更改,实际上是把暂存区的所有内容提交到当前分支

Git 跟踪修改,若没有add添加到暂存区,就不会加入到commit 队列

版本比对

命令:git diff HEAD --<file>
作用:查看工作区和版本库里最新版本的区别

撤销修改

命令:git checkout -- <file>

作用:撤销工作区修改,让文件回到最近一次git commit 或git add时的状态,”–”很重要,没有则为切换分支;已添加到缓存区的无法直接撤销,需先重置缓存区,配合git reset使用

重置

命令:git reset

作用:既可以回退版本,也可以把暂存区的修改,非删除的回退到工作区

命令:git reset HEAD <file>
作用:撤换暂存区的修改unstage,重新放回工作区

注:

1.直接丢弃工作区,非缓存区的修改checkout -- <file>

2.修改了工作区内容,且添加进缓存区,想丢弃修改,先git reset HEAD <file>git restgit checkout -- <file>

3.工作区修改已提交版本库,恢复只能通过版本回退!

删除文件 rm

命令:git rm <file>

作用:从版本库删除文件

注:删除后需commit提交,否则工作区与版本库不一致

命令: git checkout -- <file>

作用:工作区删除但未提交,可以用版本库版本替换工作区版本,无论工作区是修改还是删除;若已提交,则无法恢复,除非回退版本

远程仓库

1.使用免费开放的GitHub

2.搭建Linux服务器

GitHub

检查用户主目录下,是否有.ssh目录id_rsa和id_rsa.pub两个文件

1.创建SSH Key

windows下打开Git Bash

命令:ssh-keygen -t rsa -C "youremail@example.com"

默认值即可,无需设置密码

2.添加用户到远程仓库

登陆GitHub,“Account settings”,“SSH Keys”页:

“Add SSH Key”,任意Title,Key文本框里粘贴id_rsa.pub文件的内容
SSH Key,GitHub需识别出推送的提交确实是本人推送,而非他人冒充。

Git支持SSH协议

GitHub允许添加多个key

1.添加远程仓库

GitHub: Create a new repo按钮创建一个新的仓库

Repository name填入仓库名repo-name,其他默认,“Create repository

2.关联一个远程库

命令:git remote add origin git@server-name:path/<repo-name>.git

如:git remote add origin git@github.com:GitHub帐户名/repo-name.git

添加后,远程库的名字就是 origin,此为Git默认名称,可以更改

3.关联后推送master分支所有内容

命令:git push -u origin <branch-name>

注:-u 关联本地库内分支与远程库内分支

命令:git push origin branch-name

每次提交本地版本库后,只要有必要,推送最新修改

也可使用: git push直接推送到当前分支关联的远程分支,未关联时使用此命令会提示

fatal: The current branch <branch> has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin <branch>

4.推送并关联远程分支:

git push --set-upstream origin <branch>

此后便可直接使用git push完成提交

注:

第一次使用Git的clone或push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。

克隆

命令:git clone git@github.com: 路径/<repo-name>.git

作用:从远程库克隆git clone

注:

必须知道仓库的地址

git支持多种协议 包括https

通过ssh支持原生git协议速度最快

分支管理

分支创建及切换

命令:git checkout -b <branch-name>
作用: 创建并切换分支

开发分支 假设为:dev分支
如:git checkout -b dev

相当于:
git branch
git checkout

命令:git branch

作用: 列出所有分支,当前分支前会标有星号

命令:git checkout <branch-name>

作用: 切换回当前分支

命令:git merge <branch-name>

作用: 合并指定分支到当前分支,直接将当前分支指向指定分支的提交内容,可理解为快速模式

git merge --no-ff -m"infomation" <branch>

作用:非快速模式,可保留分支信息

命令:git branch -d <branch-name>

作用: 删除分支

解决冲突

多分支同时修改相同文件,合并时可能会出现冲突提示:
Automatic merge failed; fix conflicts and then commit the result.

此时需手动解决冲突,再add ,commit

题外话:android studio中:右键冲突文件—>解决冲突—>apply

查看分支合并图

命令:
git log --grahp

作用:显示多行分支信息

命令:
git log --graph --pretty=oneline --abbrev-commit
作用:单行显示分支信息

分支管理策略

git merge <branch>

快速模式合并分支,会丢失分支信息

git merge --no-ff -m"infomation" <branch>
普通模式,禁用Fast forward 模式

git log
日志查看:普通模式下,合并后可以看到曾经做过合并,有历史分支信息;

分支管理策略

master分支应该是最稳定的,仅用来发布新版本,平时不能操作,在dev分支开发,发布时再合并到master分支

说明:

  1. master分支是主分支,需要时刻与远程同步

  2. dev 是开发分支,团队所有成员都在上面工作,也需要与远程同步

  3. bug分支 只用于本地修复bug,没必要推送到远程

  4. feature分支是否推送到远程,取决于是否和小伙伴合作开发

  5. 克隆远程库默认只可见master分支

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

本地工作分支提交修改

建立本地分支与远程分支链接

本地创建和 远程库分支 对应的分支,名称最好一致:
远程分支:origin/branch-name
git checkout -b <branch-name> origin/<branch-name>

建立本地与远程分支的连接
git branch --set-upstream-to branch-name origin/branch-name

从远程仓库克隆时,Git自动把本地master分支和远程master分支对应,远程仓库默认名称是origin,以创建为准

强行删除分支:
git branch -D <branch-name>

本地未完成的修改临时存储

列出已有存储
git stash list

临时存储工作现场,保存未完成的工作,确保工作区干净,以便切分支,完成其他任务

git stash

恢复工作现场

  1. git stash apply 提交恢复

    git stash drop删除stash内容

批量删除可以使用git stash clear

  1. git stash pop 恢复的同时删除stash内容

当有多次stash时:

可先 git stash list查看id,然后恢复指定stash

git stash apply <stash-id>

如:git stash apply stash@{0}

查看远程仓库信息

git remote

显示更详细信息

git remote -v

注:若没有推送权限,将看不到push地址

远程修改抓取

推送本地修改之前必须要先做的

抓取分支
git pull
注:建立本地与远程对应分支连接后再拉取,无需任何分支名称。

推送分支

指定本地分支推送到远程库
git push origin

如:dev分支

git push origin dev
注:若推送失败,先用git pull抓取远程的新提交

git push
注:从指定远程库分支抓取最新提交,若有冲突,先手动解决冲突,再push

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

  1. 试图用 git push origin bracn-name 推送自己的修改
  2. 如果推送失败,先用 git pull试图合并
  3. 如果合并有冲突,则解决冲突,并在本地提交
  4. 没有或解决掉冲突后,再用git push origin branch-name推送就可以成功

标签管理

tag与commit-id绑定,便于查找

查看标签

git tag
查看所有标签

打新标签

  1. 切换到需要打标签的分支

    先查看分支信息git branch

    切换指定分支git checkout <branch>

  2. git tag

新标签默认打在HEAD,既最新提交的commit上

指定提交记录打标签:

  1. 查找历史提交commit id
    git log --pretty=oneline --abbrev-commit
  2. 再打标签
    git tag <tagname> commit-id

标签默认按字母排序,不按时间

查看标签信息

git show <tagname>

创建带有说明的标签

-a指定标签名,-m指定说明文字
git tag -a <tagname> -m "infomation" commit id

用私钥签名标签 -s
git tag -s <tagname> -m "infomation" commit id

说明:

签名采用PGP,必须先安装gpg(GnuPG),若没找多或没有gpg密钥对,就会报错
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
如果报错,请参考GnuPG帮助文档配置Key。
git show 可以看到GPG签名信息

删除标签

git tag -d

将标签推送到远程

git push origin
一次性推送全部尚未推送到远程的本地标签
git push origin –tags

删除远程标签

1.先删除本地

git tag -d

2.从远程删除,push命令

git push origin :refs/tags/

3.检查远程删除结果,登录GitHub查看

Git 配置

自定义Git

让Git显示颜色
git config –global color.ui true

忽略特殊文件

1.编写.gitignore
在Git工作区根目录创建特殊的.gitignore文件,添加要忽略的文件名

2..gitignore 文件要放入版本库,并且可以对.gitignore做版本管理
检验.gitignore的标准是git status命令是不是说working directory clean

检查规则是否有误,是否忽略了指定具体文件:
git check-ignore -v

添加被.gitignore忽略的文件到版本库,强制性

git add -f

忽略文件的原则是:

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

命令别名

git config --global alias.

如 :st表示status git config –global alias.st status
co表示checkout
ci 表示commit
br 表示branch

撤销更改别名配置:unstage

原命令: git reset HEAD file
git config –global alias.unstage ‘rest HEAD’

更改后:git unstage <file>

显示最后一次提交的信息 git last

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

更改后:git last

配置log

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"

更改后:git lg

注:–global针对当前用户起作用,不加只对当前仓库起作用
每个仓库的配置文件位置:.git/config

查看:cat .git/config

配置的别名在[alias]后

当前用户的Git配置文件在用户主目录下的一个隐藏文件.gitconfig
查看:cat .gitconfig

使用GitHub

GitHub 可以任意Fork开源仓库

自由拥有Fork后的自己帐号下的仓库的读写权限

自由从自己帐号下clone仓库才能推送修改

克隆

git clone git@github.com: michaelliao/bookstrap.git

可以推送pull request 给官方仓库贡献代码,官方决定是否接受

删除已有的GitHub远程库

git remote rm origin

关联远程库

git remote add origin git@gitee.com:path/<name>.git

码云

国内Git 托管服务 gitee.com

同时关联多个远程库

git的远程库默认名称是origin ,多个远程库需要不同的名称标识

使用

已关联了GitHub远程库的情况下:

1.先删除已关联的名为origin的远程库

git remote rm origin

2.关联GitHub远程库

git remote add github git@github.com:路径/<name>.git

3.关联码云远程库

git remote add gitee git@gitee.com:路径/<name>.git

此时查看远程库信息,可以看到两个远程库

git remote -v

推送到GitHub

git push github master

推送到码云

git push gitee master

搭建Git服务器

使用Linux机器。推荐Ubuntu 或Debian

假设有sudo权限的用户帐号

1.安装git sudo apt-get install git

2.创建git用户,运行git服务 sudo adduser git

3.创建证书登录
收集所有需要登录的用户的公钥,.id_ras.pub文件,导入到/home/git/.ssh/authorized_keys文件,一行一个

4.初始化Git仓库,选定一个目录作为Git仓库,假设为/srv/sample.git
在/srv目录下输入 sudo git init –bare sample.git
会创建一个裸仓库,没有工作区,通常以.git结尾,将owner改为git
sudo chown -R git:git sample.git

5.禁用shell登录,出于安全考虑,git用户不允许登录shell,通过编辑/ect/passwd文件完成

git:x:1001:1001:,,,:/home/git:/bin/bash
改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

git用户可以正常通过ssh使用git,因为我们为git用户指定的git-shell每次一登录就自动退出

克隆远程仓库
git clone git@server:/srv/sample.git

* 搭建Git服务器非常简单,通常10分钟即可完成;
* 要方便管理公钥,用Gitosis;
* 要像SVN那样变态地控制权限,用Gitolite。

扩展:

Git 与Android studio 的关联
日常工作中可以通过studio的命令行来操作,减少窗口切换,省时省力

安装完git后,将git路径添加进studio:
studio —setting—Version Control—Git—>

Test之后显示Successfully表明成功
Terminal窗口内测试一下:输入git


搞定

完结撒花