有些操作还没有用到,慢慢补充完善
一、常用操作
1. git config
配置git
//设置全局变量
git config --global user.name "xxx"
git config --global user.email "xxx@gmail.com"
//查看所有config
git config --list
2. git add
将修改添加到暂存区
git add . //将所有修改添加到暂存区
工作区(Working Directory)
就是在电脑里能看到的目录,比如learngit文件夹就是一个工作区:
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的时候,是分两步执行的:
是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
3. git clone
克隆代码
git clone xxx //从远程仓库克隆代码
git pull时报错:ssh: connect to host github.com port 22: Connection refused,需要更换仓库地址,例如从https换成ssh
4. git status
文件,文件夹在工作区,暂存区的状态
git status
git status分为三种:Untracked files、Changes not staged for commit、Changes to be committed
Untracked files:git add 前,之前文件不存在
Changes not staged for commit:git add 前,之前文件已存在
Changes to be committed:git add后,git commit前
5. git diff
比较不同
git diff <file>
工作目录文件和暂存区文件进行比较git diff <id1><id1><id2>
比较两次提交的差异git diff <branch1> <branch2>
比较两个分支git diff --staged
暂存区和版本库差异git diff --cached
暂存区和版本库差异git diff --stat
比较统计信息
git diff: 当工作区有改动,暂存区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,暂存区不为空,diff对比的是“工作区与暂存区的共同文件”。
git diff --cached 或 git diff --staged:显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改
git diff HEAD:显示工作目录(已track但未add文件)和暂存区(已add但未commit文件)与最后一次commit之间的的所有不相同文件的增删改
6. git commit
提交
git commit -m 'xxx' //将索引的当前内容描述更改的用户和日志信息一起保存在新的提交中。
7. git reset
回退版本,或者把暂存区的修改回退到工作区
git reset --hard commit_id
git reset --soft commit_id
或者git reset commit_id
8. git rm
删除远程仓库内容
git rm text1.txt
9. git mv
用于移动或重命名一个文件、目录或软连接
git text.txt mydir
//等价于下面三条命令:
mv test.txt mydir/
git rm test.txt
git add mydir
10. git branch
分支
git branch
/git branch --list
查看本地分支git branch -r
查看远程分支git branch -a
查看所有分支(远程分支+本地分支)git checkout -b dev origin/dev
git checkout dev
切换分支(从远程checkout dev分支,本地命名为dev,并切换到该分支)git merge dev
将dev分支合并到当前分支git push origin --delete dev
删除远程dev分支git branch -D dev
删除本地分支git branch -m xxx
重命名本地分支git branch -vv
查看本地分支和远程分支的对应关系
11. git checkout
检出,最为常用的两种情形是创建分支和切换分支。
git branch branchName
创建新分支git checkout branchName
切换到新分支git checkout -b branchName
创建新分支并切换到新分支
HEAD是checkout的灵魂,checkout后HEAD指向会改变
cat .git/HEAD //查看head指向
>>> ref: refs/heads/master
cat .git/refs/heads/master //最新版本号
>>> 37e16039099f6eee0552f8bd9a447ac1c1874865
git log --oneline
>>> 37e1603 (HEAD -> master, origin/master, origin/HEAD) 合并代码
12. git merge
合并代码
git merge dev //将dev合并到当前分支
13. git log
查看提交历史记录
git log --oneline
/git log --pretty=oneline
以精简模式显示
git log --graph
以图形模式显示git log --stat
显示文件更改列表git log --author= 'name'
显示某个作者的日志git log -p filepath
查看某个文件的详细修改git log -L start,end:filepath
查看某个文件某几行范围内的修改记录git log --stat commitId 或者 git show --stat commitId
查看某一次提交的文件修改列表
14. git stash
把当前未提交的修改暂存起来,让仓库还原到最后一次提交的状态。常用于更新、同步代码或者保存多个修改版本等情况下,可跨分支。
注:在未add之前才能执行stash!!!!
git stash [save message]
保存,save为可选项,message为本次保存的注释git stash list
所有保存的记录列表git stash show -p
显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -pgit stash apply
应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1},可恢复多次git stash pop
命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,通过git stash list可查看具体值,比如应用并删除第二个:git stash pop stash@{1}。只能恢复一次git stash drop stash@{num}
删除某个保存,num是可选项,通过git stash list可查看具体值git stash clear
删除所有保存
15. git tag
tag是git版本库的一个标记,指向某个commit的指针。tag 是一个点,是不可移动的。
创建 tag 是基于本地分支的 commit,而且与分支的推送是两回事,就是说分支已经推送到远程了,但是你的 tag 并没有,如果把 tag 推送到远程分支上,需要另外执行 tag 的推送命令。
(1) 创建tag
-
git tag <tagName>
创建本地tag -
git tag -a v0.1.0 -m "release 0.1.0 version"
创建附注标签 -
git push origin <tagName>
推送到远程仓库,指定一个tag -
git push origin --tags
push所有tag
以上是基于本地当前分支的最后的一个commit 创建的 tag ,但是如果不想以最后一个,只想以某一个特定的提交为tag ,也是可以的,只要知道commit 的id。
git log --pretty=oneline
查看当前分支的提交历史 里面包含 commit id
git tag -a <tagName> <commitId>
以历史版本作为taggit tag -a <tagname> -m "XXX..."
指定标签信息
(2)查看tag
-
git show <tagName>
查看本地指定 tag: -
git tag 或者 git tag -l
查看本地所有 tag: -
git ls-remote --tags origin
查看远程所有tag
(3)删除tag
-
git tag -d <tagName>
删除本地tag -
git push origin :<tagName>
删除远程tag
(4)检出tag
git checkout -b <branchName> <tagName>
检出tag到新分支git checkout [tagname]
切换tag
因为 tag 本身指向的就是一个 commit,所以和根据commit id 检出分支是一个道理。
但是需要特别说明的是,如果我们想要修改 tag检出代码分支,那么虽然分支中的代码改变了,但是 tag标记的 commit还是同一个,标记的代码是不会变的,这个要格外的注意。
16. git fetch
从远程获取代码库
git fetch origin/master //从master分支拉取代码
17. git pull
从远程获取代码库,并自动合并
git pull和git fetch的区别
git fetch
:是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git pull
:则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
18. git remote
用于在远程仓库的操作
git remote -v
显示所有远程仓库git remote show [remote]
显示某个远程仓库的信息git remote add [shortname] [url]
添加远程版本库
提交到 Github
git remote add origin xxx.git
git push -u origin master
git remote rm name
删除远程仓库git remote rename old_name new_name
修改仓库名
19. git rebase
20. git restore
git restore --worktree [file]
表示撤销工作区的的修改,参数等同于 -Wgit restore --staged
表示撤销暂存区的修改,将文件状态恢复到未 add 之前,参数等同于 -Sgit restore -s HEAD~1
表示将当前工作区切换到上个 commit 版本git restore -s [commit id]
表示将当前工作区切换到指定 commit id 的版本
二、操作场景
1. 提交代码
git add .
将本地所有修改了的文件添加到暂存区git commit -m ''
提交信息,将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中git pull origin
拉取远程最新代码,完成之后打开代码查看有没有冲突,并解决,如果有冲突解决完成以后再次执行1跟2的操作git push origin master
将代码推至远程
2. git 放弃本地修改,强制拉取更新
开发时,对于本地的项目中修改不做保存操作(或代码改崩),可以用到Git pull的强制覆盖
git fetch --all
指令是下载远程仓库最新内容,不做合并git reset --hard origin/master
把HEAD指向master最新版本
3. 版本回退
场景1:改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,执行命令
git checkout -- file
场景2:不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改
(1)用命令git reset HEAD <file>
,
(2)第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,没有推送到远程库,想要撤销本次提交,执行命令
(1)git log
:查看版本号
(2)git reset --soft/hard <commit_id>
git reset
缺省为git reset --soft
二者区别:
git reset --soft
:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset --hard
:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉
在Git中,用
HEAD
表示当前版本,上一个版本就是HEAD^
,上上个版本是HEAD^^
,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
git reset --soft/hard HEAD^
:回退到上一个版本
git reset --soft/hard 1094a
:回退到指定版本,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位
场景4:执行了git reset --hard
,后悔执行了这个操作,想要回退到最新版本
(1) git reflog
:查看历史,确定回退版本号
(2)git reset --soft/hard <commit_id>
三、常见错误
1. ssh: connect to host github.com port 22: Connection refused
- 查询远程仓库地址
remote -v
factory https://github.com/jacksyang/factory (fetch)
factory https://github.com/jacksyang/factory (push)
origin git@github.com:lam-team/logmon-web.git (fetch)
origin git@github.com:lam-team/logmon-web.git (push)
- 删除远程仓库
git remote rm origin
- 添加http远程仓库
git remote add origin https://github.com/lam-team/logmon-web.git
- 将新添加的远程仓库和本地仓库关联起来
git branch --set-upstream-to=origin/master master