更新日志:
2019-11-27 更新问题总结章节
2019-04-28 文章发表
前言
Git 是一个分布式版本控制系统,不同类型的版本控制软件还有 svn,mercurial,vss,SourceAnywhere 等。
GitHub 是一个集成了 git 的服务。 它可以以网页或者客户端的形式,帮助用户把 git 本地的数据提交到远程的服务器里。
Git 和 GitHub 在版本控制方面十分好用,指令集也高达几百条,这里总结一些平时常用指令。
初始化
git init
: 初始化当前目录;
git init [name]
: 指定目录初始化;
git clone [url]
: 克隆项目;
1 2 3 4 5 6 7 8
| $ git init
$ git init newrepo
$ git clone https://github.com/VincentTV/before-after-slider.git
|
配置
git config user.name [name]
: 项目配置,用户名;
git config user.email [email]
: 项目配置,用户邮箱;
git config --global user.name [name]
: 全局配置,用户名;
git config --global user.email [email]
: 全局配置,用户邮箱;
git config --list
: 查看当前 git 配置;
1 2 3 4 5 6 7 8 9 10
| $ git config user.name "Vincent F0ng" $ git config user.email "vincefong1018@gmail.com"
$ git config --global user.name "Vincent F0ng" $ git config --global user.email "vincefong1018@gmail.com"
$ git config --list
|
基本操作
git status
该命令用于查看项目的当前状态。
1 2 3 4 5
| $ git status
$ git status -s
|
git add
该命令可将该文件添加到缓存区。
git add [file/dir]
: 添加文件或目录到缓存区;
git add .
或 git add -A
: 添加所有文件
1 2 3 4 5 6 7 8 9
| $ git add [file1] [file2] ...
$ git add [dir]
$ git add . $ git add -A
|
git commit
该命令可将提交暂存区到仓库区。
git commit -m [message]
: 提交暂存区所有文件;
git commit [file1] [file2] -m [message]
: 指定文件提交;
git commit -a -m [message]
: 直接从工作区提交到仓库区;
1 2 3 4 5 6 7 8
| $ git commit -m "提交信息"
$ git commit file1.js file2.js -m "提交信息"
$ git commit -a -m "提交信息"
|
git rm
该命令可将文件从工作区、缓存区移除。
如果只是简单地从工作目录中手动删除文件,运行 git status
时就会有 Changes not staged for commit
的提示。
1 2 3 4 5 6 7 8
| $ git rm [file]
$ git rm -f [file]
$ git rm --cached [file]
|
git diff
该命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ git diff
$ git diff --cached [file]
$ git diff HEAD
$ git diff [first-branch]...[second-branch]
$ git diff --shortstat "@{0 day ago}"
|
分支管理
- git branch
- git checkout
- git merge
查看分支
1 2 3 4 5 6 7 8
| $ git branch
$ git branch -r
$ git branch -a
|
新建分支
1 2 3 4 5
| $ git branch [branch-name]
$ git checkout -b [branch]
|
切换分支
1 2 3 4 5
| $ git checkout [branch-name]
$ git checkout -
|
合并分支
1 2 3 4 5
| $ git merge [branch]
$ git cherry-pick [commit]
|
删除分支
1 2 3 4 5 6
| $ git branch -d [branch-name]
$ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
|
查看历史及版本操作
历史记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ git log
$ git log --oneline
$ git log --stat
$ git log -S [keyword]
$ git reglog
|
版本操作
1 2 3 4 5 6 7 8
| $ git reset --hard [HEAD值]
$ git reset --hard HEAD^
$ git reset --hard HEAD~2
|
远程仓库
初始化
git remote -v
: 查看;
git remote add [remote-name] [url]
: 查看;
1 2 3 4 5
| $ git remote -v
$ git remote add origin https://github.com/VincentTV/before-after-slider.git
|
ssh key
创建公钥(需先配置全局用户)
添加密钥在 push
时可以不用密码验证,也可使用 ssh 关联远程仓库。
ssh-keygen -t rsa
: 生成密钥;
ssh-keygen -t rsa -C [email-address]
: 可在密钥中添加邮箱信息;
生成的密钥在用户根目录下的 ~/.ssh
目录中,id_rsa
为你的私钥(不要随便给别人),id_rsa.pub
为你的公钥。
1 2 3 4 5 6
| $ cd ~ $ ssh-keygen -t rsa $ cd .ssh $ cat id_rsa.pub
|
Github 添加密钥
github->settings->SSH and GPGkeys->new ssh key->输入公钥
推送
1
| $ git push [remote-name] [branch-name]
|
下载
1 2 3 4 5 6 7 8 9 10 11
| $ git fetch [remoteName] [BranchName]
$ git checkout [remoteName/BranchName]
$ git merge [remoteName/BranchName]
$ git pull [remoteName] [BranchName]
|
问题总结
冲突解决
场景一:本地和远程在同个 HEAD 后都有 commit
场景说明:A 与 B 同时操作了同个 HEAD,无论谁先 push 了代码到远程仓库,后者 git pull
或 push
可能产生如下两种状况;
- 两者修改地方不是同一处代码时,会自动合并;
git pull
会让输入 commit 信息,相应 log 也会多出一条 commit 信息。
- 两者修改代码冲突时,手动解决冲突文件,相应代码位置会出现冲突解决选项(VScode 环境)
场景二:本地中途拉取更新
场景说明:本地修改代码,但并未完成时想拉取远程的更新。直接 git pull
会出现如下提示;
方法一:本地直接 commit
后,参考场景一;
方法二:代码未完成,并不想提交,可使用 git stash
缓存修改的代码;
git stash
缓存工作区修改;
git stash list
查看缓存;
git stash pop
提取缓存;
git stash clear
清除缓存;
所以可操作:git stash
=> git pull
=> git stash pop
同样,代码不冲突,会自动合并,如果出现代码冲突,会进入冲突解决状态:
GitHub commit 回退删除
放弃修改,本地回退后强制提交 GitHub。
- 本地回退
1
| $ git reset --hard [HEAD]
|
- 本地文件修改后,强制提交
1
| $ git push [remoteName] HEAD --force
|
删除中间不必要 commit 。
场景说明:commit A => B => C,删除 B 达到 commit 记录只有 A=>C。
- 本地回退到 A
git cherry-pick [HEAD]
工作区获取最新 C 代码,代码冲突时需要手动解决冲突。
git add
、git commit
后强制提交。
1
| git push [remoteName] HEAD --force
|
此时查看 git log
就只有 A 和最后一次的 commit 了。