-
创建repository:
-
选择合适的地方
$ pwd /Users/zewenhua/IdeaProjects/DataStructureAndAlgorithms -
将目录变成Git可以管理的repository
$ git init -
把文件添加到repository
- 添加到repository
$ git add readme.txt- 提交到repository
$ git commit -m "wrote a readme file"
-
-
时光机穿梭
掌握工作区状态:
$ git status查看修改内容:
$ git diff readme.txt-
版本回退
-
查看版本历史记录(--pretty=oneline 简略信息):
$ git log --pretty=oneline -
回退版本:在Git中,
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,HEAD~100表示上100个版本。回退到上一个版本:
$ git reset --hard HEAD^指定回到某个(过去或未来)版本: (如: 回到commit id为 1094adb... 的版本;版本号前几位即可,Git自动寻找)
$ git reset --hard 1094a如回退后失去commit id,可查询命令记录:
$ git reflog
-
-
工作区与暂存区
- 工作区(Working Directory): 电脑里能看到的目录
- 版本库(Repository): 工作区中的隐藏目录
.git为Git的版本库- Git版本库 = 暂存区(stage/index)+ 自动创建的第一个分支master,以及指向master的指针HEAD
- 添加文件:
- 第一步
git add把文件修改添加到暂存区; - 第二步
git commit把暂存区的所有内容提交到当前分支。
- 第一步
-
Git管理修改而非文件
查看工作区和版本库最新版本的区别:
$ git diff HEAD -- readme.txt -
撤销修改
-
将readme.txt在工作区的修改全部撤销(其实是用版本库里的版本替换工作区的版本),分为两种情况:
- 还没放到暂存区,则回到和版本库一样的状态
- 已经添加到暂存区,则回到添加到暂存区后的状态
$ git checkout -- readme.txt -
将readme.txt在暂存区的修改全部撤销:
$ git reset HEAD readme.txt
-
-
删除文件
工作区删除文件:
$ rm test.txt现有两种选择:
-
从版本库中删除文件:
$ git rm test.txt $ git commit -m "remove test.txt" -
误删,从版本库中恢复:
$ git checkout -- test.txt注意:从来没有被添加到版本库就被删除的文件,无法恢复!
-
-
-
远程仓库
-
添加远程库
-
登录GitHub,创建一个新的仓库
-
关联本地仓库与远程仓库
$ git remote add origin git@github.com:ZewenHua/DataStructureAndAlgorithms.git -
把本地库的所有内容推送到远程库
$ git push -u origin master-u: 本地master分支和远程master分支关联起来,以后推送和拉取可以简化命令
-
-
从远程库克隆
$ git clone git@github.com:ZewenHua/DataStructureAndAlgorithms.git
-
-
分支管理
-
创建与合并分支
-
创建+切换分支(2种方式)
$ git checkout -b dev$ git switch -c dev创建分支
$ git branch dev切换分支
$ git checkout dev$ git switch dev -
查看当前分支
$ git branch -
合并分支
$ git checkout master $ git merge dev -
删除分支
$ git branch -d dev如果分支没有合并过
$ git branch -D dev
-
-
分支管理策略
-
禁用
Fast Forward$ git merge --no-ff -m "merge with no-ff" dev -
分支策略
master分支非常稳定,仅用来发布新版本,平时不在上面干活- 每个人都有自己的分支,不时往
dev分支合并 - 要发布版本时,把
dev分支合并到master上
-
-
Bug分支
场景:正在做工作,接到一个修复一个代号101的bug任务,当前正在
dev上进行的工作还没提交,工作只进行到一半,没法提交。-
将当前工作现场“储藏”起来,以便以后恢复现场后继续工作
$ git stash -
假定在
master分支上修复,切换master创建临时分支,且建立关联$ git checkout master $ git checkout -b issue-101 $ git push origin issue-101 $ git branch --set-upstream-to=origin/issue-101 $ git pull -
修复bug,提交
$ git add readme.txt $ git commit -m "fix bug 101" [issue-101 4c805e2] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-) -
修复完成后,切换到
master,合并,删除issue-101分支$ git switch master $ git merge --no-ff -m "merged bug fix 101" issue-101 $ git branch -d issue-101 -
回到dev分支干活;查看,此时工作区是干净的
$ git switch dev $ git status -
查看工作现场列表
$ git stash list stash@{0}: WIP on dev: f52c633 add merge -
恢复工作现场
恢复+删除stash内容
$ git stash pop恢复
$ git stash apply stash@{0}删除stash内容
$ git stash drop stash@{0}清空stash内容
$ git stash clear -
在
dev分支上修复同样的bug,Git提供了赋值一个特定提交到当前分支的命令$ git cherry-pick 4c805e2 [master 1d4b803] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-)
-
-
多人协作
-
查看远程库信息(
-v显示详细信息)$ git remote -v origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)如果没有推送权限,就看不到push的地址
-
克隆分支(只能看到
master)$ git clone git@github.com:michaelliao/learngit.git想要在
dev分支上开发,必须创建origin的dev分支到本地$ git checkout -b dev origin/dev -
工作模式
-
试图推送自己的修改
$ git push origin dev -
如推送失败,则因为远程分支比本地更新,把最新提交抓下来合并
$ git pull如果提示
no tracking information表示没有指定本地dev分支与远程origin/dev分支的链接,则设置链接,再pull$ git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'. $ git pull -
如合并有冲突,解决冲突,本地提交
$ git add env.txt $ git commit -m "fix env conflict" -
再推送
$ git push origin dev
-
-
-
-
标签管理
tag就是让人容易记住的名字,根某个commit绑在一起。
-
创建标签
$ git tag v0.9 f52c633 $ git tag -a v0.1 -m "version 0.1 released" 1094adb查看所有标签
$ git tag -
操作标签
-
删除标签
$ git tag -d v0.1 -
推送某标签到远程
$ git push origin v1.0推送所有未推送的标签到远程
$ git push origin --tags -
删除已推送的标签
-
先删除本地
$ git tag -d v0.9 -
远程删除
$ git push origin :ref/tags/v0.9
-
-
-