Git基本命令

创建git仓库

创建目录

$ mkdir <dirname>
$ cd <dirname>
$ pwd

初始化Git仓库

$ git init

将文件添加到Git仓库

$ git add <file>  // 可反复多次使用,添加多个文件
$ git add .  // 提交全部文件
$ git commit -m <message>

所有的版本控制系统,其实只能跟踪文本文件的改动。而图片、视频这些二进制文件没法跟踪文件的变化,只能把二进制文件每次改动串起来,不能知道具体更改内容。

修改及撤销

查看修改

$ git status  // 查看被修改过,但还没准备提交的修改
$ git diff <file>  // 查看difference,显示的格式正是Unix通用的diff格式
$ git diff HEAD -- <file>  // 查看工作区和版本库里面最新版本的区别

版本回退

$ git log  // 查看git提交历史,以便确定要回退到哪个版本
$ git log --pretty=oneline  // 简化输出信息

$ git reflog  // 查看所有git命令历史,以便确定要回到未来的哪个版本
$ git reset --hard HEAD^  // 回退到上一个版本
$ git reset --hard <commit id>  // 指定到(过去或未来)的某个版本,版本号写前几位即可

撤销修改

撤销工作区:

$ git checkout -- <file>  // 把文件在工作区的修改全部撤销,让这个文件回到最近一次git commit或git add时的状态

撤销暂存区:

$ git reset HEAD <file>  // 把暂存区的修改撤销掉(unstage),重新放回工作区
$ git checkout -- <file> 

撤销版本库:

$ git reset --hard HEAD^  // 回退到上一个版本

删除文件

$ rm <file>
$ git rm <file>
$ git commit -m "remove <file>"

撤销删除:

$ git checkout -- <file>

从来没有被添加到版本库就被删除的文件,是无法恢复的。

rebase

$ git rebase  // 把本地未push的分叉提交历史整理成直线

远程仓库

创建ssh key

$ ssh-keygen -t rsa -C "youremail@example.com"

添加远程库

$ git remote add origin git@<server-name>:<path>/<repo-name>.git  // 关联已有的本地仓库
$ git push -u origin master  // 第一次推送master分支的所有内容,添加-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来
$ git push origin master  // 推送最新修改

从远程库克隆

$ git clone <link>

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

查看远程库信息

$ git remote
$ git remote -v // 查看更详细的信息

推送远程分支

$ git push origin <branch-name>

抓取分支

$ git branch --set-upstream-to origin/<branch-name> <branch-name> // 指定本地分支与远程分支的链接

$ git pull  //抓取分支, 遇到no tracking information,需先执行上条命令,指定本地分支与远程分支的链接

关联多个远程库

$ git remote -v
$ git remote rm origin  // 删除默认远程库名

$ git remote add <origin1> <link1>  // 绑定远程库1
$ git push <origin1> master  // 推送至远程库1

$ git remote add <origin2> <link2>  // // 绑定远程库2
$ git push <origin2> master  // 推送至远程库2

分支管理

创建分支

$ git checkout -b dev  // 创建并切换到dev分支
-b参数表示创建并切换,相当于:
$ git branch dev  // 创建dev分支
$ git checkout dev  // 切换到dev分支

查看当前分支

$ git branch
* dev  // 当前分支前面会标一个*号
  master

合并分支

$ git checkout master  // 切换到master分支
$ git merge dev  // 将dev分支的工作成果合并到master分支上
$ git merge --no-ff -m "merge with no-ff" dev  // --no-ff参数,表示禁用Fast forward,用普通模式合并,保留历史分支信息

删除分支

$ git branch -d <name>
$ git branch -D <name> // 强行删除未合并的分支

解决冲突

$ git status  // 查看冲突的文件

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

$ git log --graph  // 查看分支合并图

储存工作区

$ git stash  // 储存工作区
$ git stash list  // 查看已存储的工作区
$ git stash apply  // 恢复工作区,stash内容并不删除,需要用git stash drop来删除
$ git stash pop  // 恢复工作区,同时删除stash内容

可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash:

$ git stash apply stash@{i}

标签管理

查看标签

$ git tag  // 查看标签
$ git show <tagname>  // 查看标签信息

创建标签

$ git tag <tagname>  // 给最新的commit打标签
$ git tag <tagname> <commit id>  // 给指定的commit打标签
$ git tag -a <tagname> -m <desc> <commit id>  // 创建带有说明的标签,-a指定标签名,-m指定说明文字

删除标签

删除本地标签:

$ git tag -d <tagname>

删除远程标签:

$ git tag -d <tagname>  // 先删除本地标签
$ git push origin :refs/tags/<tagname>  // 将删除推送到远程

推送标签到远程库

$ git push origin <tagname>  // 推送单个标签
$ git push origin --tags  // 推送全部尚未推送到远程的本地标签

自定义Git

自定义配置

$ git config --global user.name <user-name>  // 配置用户名
$ git config --global user.email <user-email>  // 配置邮箱

$ git config --global color.ui true  // 让Git显示颜色

--global参数,表示这台机器上所有的Git仓库都会使用这个配置!

忽略特殊文件(.gitignore)

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
$ git add -f <file>  // 强制添加被忽略文件到git
$ git check-ignore -v <file>  // 检查忽略规则

配置别名

$ git config --global alias.<commond-name> <commond>

例:

$ git config --global alias.unstage 'reset HEAD'

$ 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的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

$ git config --list  // 查看git配置

每个仓库的Git配置文件都放在.git/config文件中:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = git@github.com:michaelliao/learngit.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[alias]
    last = log -1

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

$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com

解决一些问题

通过https方式连接git报403权限错误

remote: Permission to <user-name>/<repositorie-name>.git denied to <old-user>. 
fatal: unable to access 'https://github.com/<user-name>/<repositorie-name>.git/': The requested URL returned error: 403

通过https连接git的时候,如果遇到上述权限拒绝的错误,拒绝的是之前配置的旧用户名,且通过查看git配置的时候也是设置正确的,那么还有一种情况是:

系统保存了旧的凭证数据,只需将旧的凭证删除即可

windows:
【控制面板】->【用户账号】->【凭证管理器】->删除对应的凭证

mac系统: 
【打开钥匙串访问】->【搜索git】->删除和xxxx相关的记录

P.S. 这也是为什么虽然是通过https的方式连接git,却也并没有每次输入密码的原因。

参考链接:

廖雪峰Git: https://www.liaoxuefeng.com/wiki/896043488029600

Git官网: https://git-scm.com/docs

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Unix 常见指令 (下面的file是指 文件名+后缀 的) s –l 列出当前目录下的所有内容(文件...
    阿敏其人阅读 2,384评论 1 2
  • 说明:博客原创作者地址传送门 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:...
    清风乀月阅读 364评论 0 4
  • 2017-03-13Git基本命令整理 Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的...
    无为不争静阅读 273评论 0 0
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,988评论 3 27
  • 内部学习群分享文字稿 分享人:黎黎,曾经的全职妈妈,现在的职场女性,坚持自我成长的学习者,践行断舍离四年。 分享题...
    孙黎黎阅读 1,640评论 5 34