git的基本使用
基本配置
-
配置用户名和密码
git config –global user.name “Your Name”
git config –global user.email “[email protected]”- 注意:git config中的–global参数,表示这台机器所有git仓库都会使用这个配置,也可以对某个仓库指定不同的用户名和email地址
基本使用篇
-
创建版本库:#选择合适地方创建空目录
1.手动建立空文件夹作为版本库
2.使用命令行创建版本库
- mkdir 目录名
- cd 目录名
- pwd 目录所在位置 (pwd表示当前目录)
创建一个仓库:git init 仓库名
git init
打开目录使用git init将这个目录变成git可以管理的仓库
向仓库中添加文件 git add 文件名
- git add .:监控工作区的状态树,把工作时的所有变化提交到暂存区
- git add -u: 仅监控已经被add的文件(即tracked file),将被修改的文件提交到暂存区
- git add -A: 上面两个功能的合集
查看仓库的状态 git status
- git status 查看仓库的状态以及是否有文件的修改
提交改动 git commit -m “*提交文件的说明*”
- git commit -am “说明”,commit类似于快照,可以利用快照恢复到最近的一个commit进行恢复。
删除文件 git rm 文件名
- git rm 文件名
查看文件的不同处 git diff 文件名
查看提交的日志历史 git log
- 显示由最近到最远提交日志,可以通过加上 –pretty=oneline参数精简信息
看到的一大串数字表示的是commit id(版本号)
- HEAD:表示是当前版本
- HEAD^:表示上一个版本
- HEAD^^:表示是上上个版本
- HEAD^~100:往上100个版本
版本回退 git reset –hard commit_id
- git reset –hard HEAD^:会退到上个版本
- git reset –hard commit id:回退到指定id,版本号没有必要写全
版本回退类似于指针,回退的时候git仅仅是将HEAD从指向当前版本变为你想要回退的那个版本
-
记录每一次输入的命令:git reflog
名词解释
- 工作区:电脑中可以看到的目录,如我们建立的作为版本库的文件夹
- 版本库:工作区中有一个隐藏目录”.git”,这个不算是工作区,而是git的版本库。
注意:
- 版本库里有很多东西,最终要的就是stage(*或者是index)*的暂存区
- git会为我们自动创建的第一个分支****master以及指向****master的一个指针叫做HEAD
向版本库添加东西分为两步:
1.git add 将文件添加进去,实际上就是将文件修改添加到暂存区
2.git commit 提交修改,实际上就是将暂存区的所有内容提交到当前分支
流程举例:工作区有一个readme.txt文件,修改这个文件,并添加一个名为LICENSE的文件
- 1.使用git status 查看状态
- 2.使用两次git add 文件名命令,将readme.txt和LICENSE文件提交后在使用git status命令查看状态
- 3.之后暂存区的状态:
- 4.使用git commit -m “提交说明”将文件提交到当前分支
- 最后版本库就变成这样,暂存区也没有任何内容
管理修改
- git管理的是修改而不是文件
举例说明:
1.修改工作区文件a.txt
2.将第一次修改后的文件a.txt添加到暂存区git add a.txt
3.再次修改工作区文件a.txt
4.提交文件修改git commit -m “…”
git管理的是修改,使用git add将工作区的第一次修改被放入缓存区,准备提交,但是第二次在工作区做的修改没有放到缓存区,所以最后使用git commit只负责把缓存区的修改即第一次的修改提交,第二次修改不会被提交
要想全部提交,可以继续 git add在git commit或者第一次修改->add->第二次修改->add->commit - git跟踪修改:每次修改,如果不add到缓存区,就不会加入commit中
查看工作区和版本库最新版本的区别git diff HEAD –文件名
撤销修改 git checkout –file
-
- 修改了文件,git add命令添加文件到缓存区,在提交前可以撤销修改, 使用git status,出现 changes to be committed表明文件只是放在缓存区,还没有提交到版本库,可以使用git reset HEAD file将缓存区的修改撤销掉(unstage)重新放回工作区
eg:
修改了a.txt文件
git add a.txt #添加到缓存区
git status #查看状态
git reset HEAD a.txt #将缓存区回退
- 修改了文件,git add命令添加文件到缓存区,在提交前可以撤销修改, 使用git status,出现 changes to be committed表明文件只是放在缓存区,还没有提交到版本库,可以使用git reset HEAD file将缓存区的修改撤销掉(unstage)重新放回工作区
丢弃工作区的修改:git checkout – readme.txt,将readme.txt文件在工作区的修改全部撤销,分为两种情况:
-
- 1.readme.txt自修改后还没有被放到缓存区,撤销修改就是回到和版本库一模一样的状态
- 2.readme.txt已经添加到缓存区,又做了修改,现在撤销修改就回到添加到缓存区后的状态
删除文件:rm a.txt 或直接在文件管理器中删除
-
- 1.从版本库中删除该文件使用 git rm 文件名,接着 git commit
- 2.删错了,从版本库中修改,”一键还原”,git checkout –a.txt
远程仓库:
1.创建SSH Key:ssh-keygen -t rsa -C “[email protected]”
2.添加ssh密匙:github登录->Account settings->add ssh key
3.添加远程仓库:远程创建一个仓库
4.联接远程仓库:git remote add origin 仓库地址,仓库的默认名称为origin,也可以改变名称
5.将本地库上的内容推送到远程仓库:git push -u origin master
-
- 本地仓库推送到远程,使用git push命令,实际将当前分支master推送到远程,第一次推送master**分支加上*-u*参数,git不但会把本地的master分支内容添加推送到远程新的*master*分支,还会把本地的master分支和远程的master分支关联**起来,以后推送或拉取就可以简化命令。
6.关联远程仓库使用命令:git remote add origin git@server-name:path/repo-name.git
7.关联之后,本地修改内容就可以通过命令****git push origin master将本地分支的最新修改推送到github
从远程仓库克隆:
-
- 1.登录github,新建仓库
- 2.克隆仓库,git clone 仓库地址
分支管理
-
一开始,默认只用一个名为master的主分支,是一条线,git使用master指向最新的提交,在用HEAD指向master,这样就可以确定当前分支以及当前分支提交点。
-
-
- 每次提交master分支就会向前移动一步,随着不断提交,master分支线越来越长,
-
- 创建新的分支:如dev,git新建了一个指针名为dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
- git管理的是修改而不是文件
-
-
- 之后对工作区的修改和提交就是针对dev分支,新提交一次后,dev指针向前移动一步,而master指针不变
-
-
-
- 分支合并:dev分支合并到master分支即直接把master指向dev的当前分支
-
-
-
- 删除分支:删除dev分支就是把dev指针删除
-
-
-
- 分支管理语法:#举例说明
-
1.创建分支:git checkout -b dev,-b参数表示创建并修改分支相当于git branch dev和git checkout dev两条命令的集合
2.查看当前分支:git branch,*表示当前分支,
-
- 切换分支修改工作区文件a.txt,并将其添加到缓存区git add a.txt
- 切换回分支master,git checkout master,查看修改内容,发现没有更改,因为实在dev分支上修改的
-
-
-
-
-
- 合并dev分支到master分支:git merge dev,merge命令合并指定分支到当前分支
-
删除分支dev:git branch -d dev
命令:
-
- 查看分支:git branch
- 创建分支:git branch name
- 切换分支:git checkout name
- 创建+切换分支:git checkout -b name
- 合并某分支到当前分支:git merge name
- 删除分支:git branch -d name
-
分支冲突的解决
-
- master分支修改了文件****a.txt,添加了一句master,使用git add a.txt添加修改到暂存区,使用git commit -m “master edit”添加到版本库
- 切换分支,git checkout -b dev,添加了一句dev,使用git add a.txt添加修改到暂存区,使用git commit -m “dev edit”添加到版本库
- 切换回分支master:git checkout master,使用git merge dev合并dev分支到master分支:git merge dev,出现冲突,手动解决冲突,删除或修改冲突的部分
- 再次提交,git add a.txt->git commit -m “conflict fixed”
- 使用git log –graph –pretty=oneline –abbrev-commit查看分支的合并情况,git log –graph命令可以看到分支的合并情况
分支管理策略
-
- 合并分支时,git可能会用”Fast forward”模式,删除分支后会丢掉分支信息
- 禁用“Fast forward”模式,git会在merge时生成一个新的commit,这样从分支历史上就可以见到分支信息
- 举例说明:
- 1.创建并切换dev分支
- 2.修改a.txt文件并提交add,commit
- 3.切换分支,合并git merge –no-ff -m “merge with no-ff” dev,因为本次合并要创建一个新的commit,所以加上-m参数,将commit描述添加
- 4.使用git log查看分支历史
分支策略:
-
- master版本应该非常稳定,仅仅用来发布新版本
注:合并分支时加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,看可以看出来曾经做过的合并,而fast forward合并就看不出曾剑做过合并。
Bug分支:
-
修复bug可以通过创建一个临时分支来解决
当前处在分支dev上,工作完成一半不能提交,需要修改master分支上的一个bug
-
- 1.“储藏”当前工作现场,等以后恢复现场后继续工作,git stash
2.切换分支,git checkout master
3.创建临时分支修改bug,git checkout -b ‘issue_101’
4.修复完bug,提交修改…add,…commit
5.切换分支,git checkout dev,恢复现场,使用git stash list查看工作现场
6.恢复工作现场,继续工作。
-
- git stash apply:恢复后,stash内容并不删除,需要使用git stash drop删除
- git stash pop:恢复的同时删除stash内容
注意:使用git stash list查看stash,使用git stash apply stash@{0},**恢复到指定的**stash
Feature分支
-
- 需要添加一个新功能,创建新分支feature-vulcan,git checkout -b “feature-vulcan”
- 开发完毕,提交版本库,git add vulcan.py,git commit -m “add feature”
- 切回dev分支,准备合并,但是临时通知取消新功能,删除git branch -d feature-vulcan,提示失败,强行删除,通过命令git branch -D feature-vulcan
多人协作
-
- git remote origin查看远程仓库信息
- git remote -v查看远程仓库详细信息,会显示可以抓取和推送的origin地址fetch->抓取,push->推送
推送分支:把该分支上的所有本地提交推送的远程仓库,推送时,要指定本地分支,使用origin 分支名,eg:git push origin master
-