1.配置
$ git config --global user.name "Your name"
$ git config --global user.email "Your email"
2.初始化
$ git init
3.提交
$ git add filename //把文件从工作区添加到暂存区
$ git commit -m "your note" //把暂存区文件提交到仓库
4.对比
$ git diff readme.txt
$ git status
5.版本回退
$ git log
$ git reflog //要重返未来, git reflog查看命令历史,以便确定要回到未来的哪个版本
$ git reset --hard HEAD^
$ git reset --hard HEAD~10
$ git reset --hard commitId
5.撤销修改
第一种情况,把readme.txt文件在工作区的修改全部撤销
$ git checkout -- readme.txt
第二种情况,把readme.txt文件在暂存区的修改全部撤销
$ git reset HEAD readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,
表示最新的版本,然后回到第一种情况。
第三种情况,把readme.txt文件在仓库的修改全部撤销
$ git log
$ git reset hard commitId
6.删除
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,
一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且
commit:
$ git rm test.txt
rm 'doc/test.txt'
$ git commit -m "remove test.txt"
[master 7d62ab8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 doc/test.txt
另一种情况是删错了,因为版本库还有呢,所以可以很轻松地把误删的文件恢复到最新版
本:
$ git checkout -- test.txt
7.关联远程仓库并提交
$ git remote add origin [email protected]:michaelliao/learngit.git
$ git push -u origin master
注:第一次提交加-u,因为git不但会把本地master分支推送到远程master分支,还会建立两个分支的关联
8.创建与合并分支
// 创建、并切换到分支dev
$ git checkout -b dev
相当于如下两条命令:
$ git branch dev
$ git checkout dev
git branch命令会列出所有分支,当前分支前会标注个*号
dev分支提交后,需要合并分支到master分支,首先切换分支到master,再把dev分支合并到master
$ git checkout master
$ git merge dev
git merge命令用于合并指定分支到当前分支
$ git merge dev
Updating 2c39e17..3792391
Fast-forward
doc/test.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 doc/test.txt
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
删除远程分支: git push origin :branch_name //注意origin后必须带有空格
看到分支合并图: git log --graph
9.解决冲突
两个分支都修改了同一文件,且未同步,如:master分支修改了test.txt文件后提交,dev分支没有pull test.txt文件的修改,然后进行修改,修改完成后提交到dev分支,切换到master分支,把dev分支合并到master分支就会产生冲突,必须手动修改。然后再提交。
$ git add test.txt
$ git commit -m "confict fixed"
10.分支管理策略
通常,合并分支,git会默认使用“Fast Forward”模式,但这种模式删除分支后,会丢掉分支信息。
如果强制禁用“Fast Forward”模式,git在merge时生成一个新的commitId,从分支历史就能看出分支信息。
请注意,准备合并分支dev时,加--no-ff参数表示禁用“Fast Forward”。
$ git merge -no-ff -m "merge with no-ff" dev
11. git存档
目前处在dev分支,开发任务还没有完成,需要临时修复一个bug,想要创建一个issue-101来修复该bug,那么要用到git提供的stash功能,把当前现场存档。
$ git stash
然后确定在哪个分支上创建bug分支,如确定在master上紧急修复bug,那就从master上临时创建分支
$ git checkout master
$ git checkout -b issue-101
修复bug,并提交后,再切回master,把issue-101合并到master
$ git checkout master
$ git merge --no-ff -m "merge bug issue-101 to master" issue-101
一切搞定后,再切回到dev分支,继续未完成的事业,需要恢复现场
$ git checkout dev
$ git stash list
有两种方法:
第一种:
$ git stash apply
$ git stash drop
第二种:
$ git stash pop
两种方法是等价的,都是恢复并删除stash内容
12.强制删除分支
如果一分支在开发完成后,接到通知需要废弃改功能,那么就没有必要合并到dev,需要删除,常规删除提示无法删除,因为该分支未合并。
$ git branch -D feature-001
13.多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
$ git remote
origin
$ git remote -v
origin https://github.com/year201412/m2018.git (fetch)
origin https://github.com/year201412/m2018.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
推送分支:
就是把该分支上的所有本地提交推送到远程分支。推送时要指定本地分支,Git会把该分支推动到远程仓库对应的分支上:
$ git push origin master
但是,并不是把所有分支往远程推送,那么哪些分支要推送,哪些分支不要推送呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面同桌作,所以也需要与远程同步;
bug分支只支于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了多少个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
在本地创建和远程分支对应的分支,本地分支名称最好和远程分支的名称一致
$ git checkout -b branch-name origin/branch�name
建立本地分支和远程分支的关联:
$ git branch --set-upstream branch-name origin/branch-name
14.标签管理
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
$ git checkout master
$ git tag v1.0
查看所有标签:
$ git tag
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 6224937
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show tagname查看标签信息:
$ git show v0.9
还可以创建带有说明的标签,-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
如果标签打错了,也可以删除:
$ git tag -d v0.1
Deleted tag 'v0.1' (was e078af9)
如果要推送某个标签到远程,使用命令git push origin tagname:
$ git push origin v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
Deleted tag 'v0.9' (was 6224937)
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
15.忽略特殊文件
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
16.多账号提交
撤销git config的全局变量
撤销记住用户名密码
$ git config --system --unset credential.helper
撤销全局用户名
$ git config --global --unset user.name
$ git config --global --unset user.email