文章目录
创建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)
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
$ 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配置文件都放在.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
参考链接:
廖雪峰Git: https://www.liaoxuefeng.com/wiki/896043488029600
Git官网: https://git-scm.com/docs