初次使用 Git 前的配置
> git config --global user.name "jiaoguoqiang"
> git config --global user.email "a@jiaook.com"
使用 git config --list
命令可以查看信息是否写入成功
初始化 Git
- 终端输入进入工作目录
cd /users/jiao/demo
- 初始化 Git
git init
在finder中 Command+Shift+. 可以显示隐藏文件
- 将文件添加到暂存区域
$ git add file1.txt
$ git add file2.txt file3.txt
git status//让我们时刻掌握仓库当前的状态
$ git diff readme.txt
- 将文件提交到 Git 仓库
将暂存区域里的东西提交到 Git 仓库中
git commit -m "add a readme file"
git commit -m "xxx" yyy.file //这是提交的文件
commit 是提交的意思,-m 选项后边跟着的是本次提交的说明,就是大概描述这一版本做了哪些改动,以便今后可以迅速查看。
总结一下,将工作目录的文件放到 Git 仓库只需要两步:
Step One -> git add 文件名
Step Two -> git commit -m "你干了啥"
- 查看状态
git status
因为使用phpstorm进行初始化,所以有个文件没有被跟踪意思就是新增加的未添加到暂存区的文件,它们处于一个逍遥法外的状态,但是你一旦将他们加入到暂存区或者提交到 Git 仓库,它们就会受到 Git 的跟踪了。圆括号你的内容{ (use "git add
- 查看历史提交记录
git log
git log --pretty=oneline//显示在一行
$ git reflog//显示所有信息
git commit -am “修改说明”
Git 会自动帮你将工作目录中所有“已跟踪”的文件先 add 到暂存区域,然后再执行 commit 命令。
•reset–用于把Git仓库的文件还原到暂存区域
checkout–用于把暂存区域的文件还原到工作目录
git reset HEAD~ 我们知道 HEAD 现在是指向 最新版本,而加一个 波浪线(~)表示它的上一个。
HEAD~ 表示 HEAD 的上一个快照(7540e6…),HEAD~~(1fe46d…)则表示 HEAD 的上上一个快照,如果希望表示上上上上上上上上上上一个快照(数了一下,这里有 10 个“上” ),那么可以直接用 HEAD~10 来表示。
•git rest –soft HEAD~
$ git reset --hard HEAD^//回退到上一个版本
–移动HEAD的指向,将其指向上一个快照
这个命令就只影响了一棵树,就只是改变了第三棵树,改变了HEAD指针的指向,但不会更改暂存区里面的内容,暂存区里面依旧存放的是上一次提交的最新的内容。
该选项的作用相当于撤销上一次的提交(commit),比如说不小心提交了,后悔了,就可以直接 git rest –soft HEAD~,相当于撤销一次错误的 commit 命令。
–soft 选项
加上 –soft 选项的结果是使得 reset 变“软”了,也就没有原来那么持久……
So, git reset –soft HEAD~ 命令就相当于只移动 HEAD 的指向,但并不会将快照回滚到暂存区域。
这个选项有什么作用呢?
事实它就是相当于撤消了上一次的提交(commit)。
一不小心提交了,后悔了,那么你就执行 git reset –soft HEAD~ 命令即可(此时执行 git log 命令,也不会再看到已经撤消了的那个提交)。
•git rest –hard HEAD~
–移动HEAD的指向,将其指向上一个快照
–将HEAD移动后指向的快照回滚到暂存区域
–将暂存区域的文件还原到工作目录
回滚文件 撤销修改
$ git checkout -- readme.txt//把readme.txt文件在工作区的修改全部撤销
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout — file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
删除文件
彻底删除文件
rm test.txt//删除文件
确实要从版本库中删除该文件 那就用命令git rm删掉,并且git commit
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
//先手动删除文件,然后使用git rm <file>和git add<file>效果是一样的。
从版本库中删除删除掉的文件
删除文件后后悔了
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
从来没有被添加到版本库就被删除的文件,是无法恢复的!
git reflog 显示所有的记录
Git 偷偷记录下了你每一次的操作(无耻小人),第一列就是每次执行完命令,HEAD 指向的版本 ID 号啦~
git log 后终端无法输入命令
输入 q
git add 命令用于把工作目录的文件放入暂存区域
git commit 命令用于把暂存区域的文件提交到 Git 仓库
git reset 命令用于把 Git 仓库的文件还原到暂存区域
git checkout 命令用于把暂存区域的文件还原到工作目录
git diff
直接使用
git diff //当前没有add 的内容修改
```
```git
git diff --cached//查看已经add 没有commit 的改动
git diff HEAD -- readme.txt//是上面两条的合并查看工作区和版本库里面最新版本的区
git diff 版本号码1 版本号码2 src : 比较两个版本号码的src 文件夹的差异
推送到github
https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416
git remote add origin git@github.com:michaelliao/learngit.git
michaelliao替换成你自己的GitHub账户名 关联本地跟github仓库
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
克隆远程库
git clone
$ git clone git@github.com:michaelliao/gitskills.git
小结
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令
git push -u origin master
```第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git
```git
push origin master
推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
分支
创建分支
git branch 分支名
$ git checkout -b dev //们创建dev分支,然后切换到dev分支
//相当于
$ git branch dev
$ git checkout dev
git branch //查看当前分支
git branch命令会列出所有分支,当前分支前面会标一个*号。
git checkout master //切换分支到master
git log --decorate //decorate 这个选项是让 log 显示指向这个提交的所有引用(比如 分支以及后面会讲的标签)
git log --decorate --oneline//一行来显示一个快照记录
git log --decorate --oneline --graph --all //--graph 选项表示让 Git 绘制分支图,--all 表示显示所有分支
查看分支
git branch
切换分支
git checkout 分支名
合并分支
git merge 分支名
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
$ git merge --no-ff -m "merge with no-ff" dev//--no-ff参数,表示禁用Fast forward
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
删除分支
git branch -d 分支名
git branch -D <name>//要丢弃一个没有被合并过的分支,强制删除
switch 切换分支
切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:
git switch -c dev//创建并切换到新的dev分支
git switch master//切换到已有的master分支
使用新的git switch命令,比git checkout要更容易理解。
git stash 当前工作现场“储藏”起来
$ git stash
//Saved working directory and index state WIP on dev: f52c633 add merge
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
git stash list//工作现场存到哪去
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
git stash pop //恢复工作现场的同时把stash内容也删了
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
cherry-pick
https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136
$ git branch
//* dev
// master
$ git cherry-pick 4c805e2
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
标签
git tag <name>//打一个新标签
$ git tag //查看所有标签
$ git tag v0.9 f52c633//找到历史提交的commit id,然后打上
git show <tagname>//查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" 1094adb//创建带有说明的标签
$ git tag -d v0.1 //删除标签
git push origin <tagname>//推送某个标签到远程
git push origin --tags//一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/<tagname> //删除一个远程标签。