git安装步骤:https://www.cnblogs.com/wj-1314/p/7993819.html
git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
git工作流:https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md
git代码管理机制
名称 | 解释 |
---|---|
Workspace | 本地的工作区 |
Index/Stage | 暂存区 |
Repository | 本地仓库 |
Remote | 远程仓库 |
git常用命令:
基本信息设置(git config)
- 设置(config)用户名 和 邮箱
- git config --global user.name “用户名,例如我就会写Leonidas”
//为“某一个仓库”配置只需要去掉global即可- git config --global user.email “邮箱,例如我就会写956xxxxx@qq.com”
//为“某一个仓库”配置只需要去掉global即可- git config --list
//查询用户信息- git config --system --unset credential.helper
//如果push遇到在输入密码错误后,就会报这个错误fatal: Authentication failed for,以上命令行是解决方案,之后你在push就会提示输入名称和密码。
- 初始化(init)本地代码仓库
- cd d:/dev/android/gitstory
//进入到相应的文件目录下,除了使用命令行之外,(Windows环境下)还可以直接通过“文件资源管理器”自己进入到想作为本地仓库的位置,点击鼠标右键打开Git Bash,然后在进行初始化操作也行。- git init
//在此目录下初始化此目录为git仓库
//git init 用于本地代码库,根文件夹下包括所有的源代码,git版本控制相关的文件在.git目录下。- git init --bare
//在此目录下初始化为一个bare git仓库
//git init --bare 意思是建一个裸库,执行命令后,根目录下只包括git版本控制相关的文件等,相对于上面.git文件夹下的所有文件。跟目录是不包括项目源代码的。
一般来讲,作为远端备份或公共版本库时,应该使用git init --bare。- PS:两种初始化方式的结果如下图
git init操作的结果
git init --bare操作的结果
- 克隆(clone)远程仓库到本地
- git clone https://github.com/Leonidas-Li/GameOfLife.git //克隆一个仓库到本地
- git clone ssh://user@host/path/to/repo.git
//克隆一个仓库到本地- git clone -b develop https://github.com/Leonidas-Li/GameOfLife.git
//拉取指定分支到本地仓库
- 添加(add)到暂存区
- git add README.md
//添加某个文件夹或文件到暂存区- git add .
//添加所有修改到stage区
- 提交(commit)到本地仓库(repository)。
- git commit -m “本次提交的注释信息”
- 状态(status)查看
- git status
//用于查看当前工作区(repository) 和 暂存区(stage)文件的状态。
使用git status命令后,会出现如下内容:
各个部分的含义如下:
(参考:http://www.softwhy.com/article-8791-1.html)
on branch master:当前工作的分支
Your branch is up to date with ‘origin/master’.:该信息只是一个提示信息!您origin/master分支是最新的。
原因可能是:
您没有更改任何内容或者更改了被忽略的文件或者更改了未提交!
Untracked files:处于未跟踪状态的文件,
-
文件所处状态介绍:
(参考:https://jingyan.baidu.com/article/cbf0e50045410a2eab28937f.html )
(1)未跟踪状态(Untracked):
未跟踪状态的文件,是在工作区,但是未纳入Git管理的文件,不参与版本控制。使用git add命令即可将未跟踪文件纳入管理。
(2)位于暂存区待提交状态(Staged):一般将文件、文件夹add后,就进入Staged状态了
(3)已修改状态(Modified):纳入跟踪的文件在工作区中被修改后就会处于Modified状态。
(4)未修改状态(unmodified):当对一个文件、文件夹进行commit操作后就进入了unmodified状态了 -
提交到远程仓库(push)操作
(参考:https://www.yiibai.com/git/git_push.html )
git push的一般形式为 git push <远程主机名> <本地分支名>:<远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin是在克隆仓库时Git创建的远程中央仓库别名。
第一个master是本地分支名,第二个master是远程分支名。
- git push origin master
// 如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。- 注意:在提交之前应该要先pull远程仓库,因为在这之前可能会有其它成员已经提交了他自己的修改,因此会报错。
git push origin :master
// 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master。- git push -u origin master
// 上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。- git push origin
// 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支。- git push
// 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名。
- pull request
pull request是git flow里的一个流程,并不是git操作,目的在于让项目组内成员知道你已经完成某模块的开发,将要合并分支了,让大家进行code review。
pull request通过则将开发完成的分支合并到稳定版本的master分支中。
合并操作分为以下几个部分:
- git checkout master
- git pull
(https://www.yiibai.com/git/git_pull.html )- git pull origin my-feature
- git push
- git pull
git pull = git fetch + git merge
- pull 和 fetch的区别
不要用git pull,用git fetch和git merge代替它
- 分支(branch)管理:
(参考:https://www.cnblogs.com/TonyYPZhang/p/6219265.html
PS: 此篇博文有个地方错误了,在分支合并的那个地方,应该是master指向的c2快照,而不是c3快照(指向c3的是iss53功能分支))
- git branch branch0
// 创建一个名叫branch0的新分支- git checkout branch0
// 切换到branche0分支- git merge branch0
// 合并branche0到master分支- git三路合并(three-way merge):
合并的内容分别来之三个地方:Git 采用三路合并( three-way merge ) 方式进行合并,创建了一个 commit ( c6 ),用于包含合并后的结果。三路合并方式,是指通过两个分支的最新提交( c4 和 c5 ),以及他们的共同祖先 c2,来进行分支合并。c6 是一个合并提交记录,特别之处是有两个祖先。
如下图:
- git branch
// 查看本地分支,前面带有“*”的分支是当前的分支。- git branch -al
//该命令列出本地和服务器上的所有分支- git branch -d branch0
// 删除本地分支, 不能删除当前checkout 的分支,如果是-D的话就是强制删除。
- 远程仓库(git remote)相关操作
(参考:https://blog.youkuaiyun.com/lamp_yang_3533/article/details/80379246 )
通过 git clone 下载项目到本地时,项目文件夹中的 .git 目录就是版本库目录。.git 目录中的 config 文件中有远程仓库的关联配置。
- git remote add origin https://github.com/Leonidas-Li/GameOfLife.git
//添加关联的远程仓库到本地- git push -u origin master
//master是以- git remote
//远程仓库的名称一般默认为origin(也可以设置为其它名称)- git remote -v
//查看关联的远程仓库的详细信息- git remote remove origin(远程仓库的名字)
//删除远程仓库关联
- rm -rf .git //删除git仓库
- git rebase用于将多个commit合并为一个或多个commit,使commit历史看起来更加清爽
- 使用方式
git rebase -i HEAD~ [n] (其中n指的是从当前commit往后要合并的总commit的个数)
然后git会显示出每条commit,并在每条commit前加上"pick"的字样,然后我们可以将想合并的commit的"pick"改为"s"就可以将这几个commit合并为一个commit了
- 实践
- git rebase -i HEAD~5
pick “commit5”
s “commit4”
s “commit3”
pick “commit2”
s “commit1”
s “commit0”
- 其它常用操作
- git log
// 查看已经提交的日志,使用Ctrl+C退出log查看页面- git diff --cached
// 查看此次提交的修改- git log -p <要对比的文件>
// 查看某个文件与上次提交的不同之处- git cheery - v
// 查看未push的commit历史(查看commit区)
git reset --hard <commit_id>
// 前面3个单词不需改变,将<commit_id>改成对应的commit_id的值
1、git冲突的场景
情景一:多个分支代码合并到一个分支时;
情景二:多个分支向同一个远端分支推送代码时;
实际上,push操作即是将本地代码merge到远端库分支上。
关于push和pull其实就分别是用本地分支合并到远程分支 和 将远程分支合并到本地分支
所以这两个过程中也可能存在冲突。
git的合并中产生冲突的具体情况:
<1>两个分支中修改了同一个文件(不管什么地方)
<2>两个分支中修改了同一个文件的名称
两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
2、冲突解决方法
情景一:在当前分支上,直接修改冲突代码—>add—>commit。
情景二:在本地当前分支上,修改冲突代码—>add—>commit—>push
注:借用vim或者IDE或者直接找到冲突文件,修改。
-
Git合并多次commit,美化commit历史。
(参考:https://blog.youkuaiyun.com/Al_assad/article/details/81145856 ) -
撤回commit
- git reset – soft HEAD^
// 只撤回commit,任然保留写的代码
// HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2- git reset --mixed HEAD^
// 不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。- git reset --hard HEAD^
// 删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。- git commit --amend
,如果commit注释写错了,只是想改一下注释,此时会进入默认vim编辑器,修改注释完毕后保存就好了。