1.使用git操作文件时,文件有三种状态 已暂存表示内容提交到了暂存区,当都准备好了再提交到git本地厂库,如下图所示: 针对Git 文件的三种状态,这里需要了解Git项目的三个工作区域:工作区、暂存区和Git仓库。
2. Git使用之创建版本库和提交代码到版本库 (1).设置用户名和密码。用户名和邮箱地址是本地Git客户端的一个变量,用户每次提交代码都会记录用户名和邮箱。 设置用户名 git config --global user.name “FELaoL” 设置邮箱 git config --global user.email felaol@sina.com 查看用户名和密码 git config user.name git config user.email 查看其他的配置信息 git config --list (2).先到你要创建版本库的目录下,在此以E:\MyCode\GitTest该目录为例,然后右键、单击“Git Bash Here” (3).使用命令:git init可以将此目录变成一个Git可以管理的版本库,并且在该目录下生成一个.git目录,切记不可随意修改,不然Git在管理该版本库时就会出现问题 (4).提交代码到版本库,先在该版本库所在的目录或者子目录下编写源代码文件,在此以HelloWorld.java源码文件为例 (4).先将HelloWorld.java提交到暂存区,使用命令:git add HelloWorld.java (5).再将代码HelloWorld.java提交到版本库,使用命令: git commit -m “(1).测试git 上传”,在提交代码到版本库成功后会返回一些信息,特别注意-m前面是两个空格," "里面为本次提交代码的说明。 3.git 命令 git status :展示的是暂存区和工作目录的状态,不涉及到本地库和远程库; git log : 查看,提交历史。 git diff: 分为两种情况,一种是当暂存区中有文件时,另一种是暂存区中没有文件 当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。 当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文件。 git diff HEAD – 文件名:比较的是工作区中的文件与版本库中文件的差异。HEAD指向的是版本库中的当前版本, 而file指的是当前工作区中的文件。 git log: 是显示当前的HEAD和它的祖先,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则。 git reflog命令:可以叫做显示可引用的历史版本记录由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog。 git reset --hard HEAD^ : 回退一个版本,一个^代表回退一个版本,两个代表回退两个版本,以此类推,只能向后回退版本。 git reset --hard HEAD~2 :回退版本,后面的数字代表向后回退的版本数目,2代表向后回退两个版本。 git reset --hard 版本号 :回退到指定版本,可向前也可向后回退到指定的版本,git reset --hard 0afbc228ff7e5568303e6f9a52b7146973a3e672 git ls-files : 显示有关索引和工作树中文件的信息
git 撤销提交 撤销暂存区 取消操作
**撤销提交 :**开发过程中我们对代码进行了修改,修改之后进行git add files,然后执行git commit -m “cmt info”,在提交之后我们就可以push到远程仓库,正常是这么操作的,但是如果在push之前发现我们改错了,不能push,这时候我们就要撤销提交,怎么办呢? 执行git reset --soft HEAD^ 该命令的意思是撤销最后一次提交并且让我们修改的文件在暂存区中。
**撤销暂存区:**假如我们在执行完git add 命令之后,想要将该文件的变化从暂存区撤回,怎么办呢? 执行命令:git restore --staged 执行之后,状态就变为了Changes not staged for commit。
取消操作: 我们对文件进行了一大堆修改,修改之后发现是错误的,想取消修改怎么办? 执行git restore ,该命令就是将工作区的文件修改取消了,相当于放弃当前的文件修改。
4.代码提交到远端仓库 在这张图面里git init, git add 和git commit 都是前期的准备, 相当于将你本地的文件都上传到了本地仓库,但是还没有像远端仓库提交; 这时执行git remote那句话,就是先将本地仓库与远端仓库建立一个链接: git remote add , 那么add什么呢? 蓝色的方框其实就是你为远端仓库所起的名字,一般都是叫origin,其实你也可以要Ceres 或者Earth,绿色方框就是你的远端仓库的真实地址;
例如: 假设我已经存在一个文件夹,里面存放自己的代码,里面有一个文件叫README.md已经写好, 则
git init //初始化一个git的本地仓库 git add README.md //将我的文件装上武器,准备发射 git commit -m “first commit” //第一次发射,我的README.md 宝贝已经成功进入到本地仓库 git remote add Ceres your_first_git_address //将第一个git address命名为Ceres git push -u Ceres master //注意咯,我要向远端木星发射了,太远了,一定要用push,很费劲的赶脚 //这时,不要动,准备再次将我的README宝贝发射到火星上去, //但是因为我的文件已经存在与本地仓库了,因此我就不需要再多余地commit等, //只需要将另一个远端仓库与本地仓库建立一个连接就可以了 git remote add Mars your_second_git_address //将第二个git address命名为Mars git push -u Mars master //再次发射,目标火星上的master分支
至此,就将一份代码上传到了两个远端仓库,但是注意你仍然时只有一个本地仓库哦 注意:在用 git push -u Ceres master 时也要注意这里master是你要上传的分支名称,如果你当前所位于的分支不叫master,用这句话上传就会出错
5.代码从远程仓库拉到本地的方法 (1).先在本地打开workspace文件夹,或者自定义的文件夹,用来保存项目代码的地方。 (2).然后登陆GitHub账号,点击复制项目路径 (3).在刚才文件夹下空白处点击鼠标右键,打开Git窗口 (4).在以下页面中输入命令 git clone 加刚才复制的路径,如下图(可能Ctrl+V用不了,可以用右键选择Paste完成复制) git clone <远程仓库地址> 这种克隆方式默认是克隆master主分支,而且通过命令 git branch --list 能看到克隆后在本地也只有这一个分支,如果再通过新建分支再拉取指定分支,甚至可能还需要解决冲突,太繁琐。 (5).输入完命令行之后回车就行,等待下载完毕,然后是切换分支问题。一般我们刚下载好拿到的都是master分支,但是开发的话都是在dev或其他分支上,所以就要进行分支切换。这里已经是切换好了的,可以看到蓝色括号内的部分已经是在dev分支上了。那么执行的命令顺序为: >>cd 加文件夹名/ 【这个 / 不要忘记添加】,然后回车 >>git checkout dev 【这样就开始切换分支了】 (6).不放心的话,或者想查看当前分支在哪的话,可以追加命令: git branch 【用来查看当前在哪个分支上】绿色部分就是当前所在的分支 (7).git克隆远程指定分支代码 git clone -b <指定分支名> <远程仓库地址> 会自动在克隆该分支在本地,同样克隆后本地只有这一个分支 相关描述:如上图所示:
git clone: 表示使用git克隆远程仓库代码; -b:这是branch的简写,代表分支的意思; copy: 代表远程仓库的分支名,也就是要克隆的指定分支名; http://192.168.1.1.copy.git: 这是远程仓库的url地址。
6.Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。 使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。 Git 分支实际上是指向更改快照的指针。 有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。 创建分支命令: git branch (branchname)
切换分支命令: git checkout (branchname)
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令: git merge
你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。 开始前我们先创建一个测试目录: $ mkdir gitdemo $ cd gitdemo/ $ git init Initialized empty Git repository… $ touch README $ git add README $ git commit -m ‘第一次版本提交’ [master (root-commit) 3b58100] 第一次版本提交 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README
列出分支基本命令: git branch
没有参数时,git branch 会列出你在本地的分支。 $ git branch
此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。 当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。 如果我们要手动创建一个分支。执行 git branch (branchname) 即可。 $ git branch testing $ git branch
现在我们可以看到,有了一个新分支 testing。 当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。 接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。 $ ls README $ echo ‘runoob.com’ > test.txt $ git add . $ git commit -m ‘add test.txt’ [master 3e92c19] add test.txt 1 file changed, 1 insertion(+) create mode 100644 test.txt $ ls README test.txt $ git checkout testing Switched to branch ‘testing’ $ ls README
当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们又重新出现了。 $ git checkout master Switched to branch ‘master’ $ ls README test.txt
我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。 $ git checkout -b newtest Switched to a new branch ‘newtest’ $ git rm test.txt rm ‘test.txt’ $ ls README $ touch runoob.php $ git add . $ git commit -am ‘removed test.txt、add runoob.php’ [newtest c1501a2] removed test.txt、add runoob.php 2 files changed, 1 deletion(-) create mode 100644 runoob.php delete mode 100644 test.txt $ ls README runoob.php $ git checkout master Switched to branch ‘master’ $ ls README test.txt
如你所见,我们创建了一个分支,在该分支上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 runoob.php 不存在主分支中。 使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。
删除分支命令: git branch -d (branchname)
例如我们要删除 testing 分支: $ git branch
- master
testing $ git branch -d testing Deleted branch testing (was 85fc7e7). $ git branch - master
分支合并 一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去: git merge
$ git branch
- master
newtest $ ls README test.txt $ git merge newtest Updating 3e92c19…c1501a2 Fast-forward runoob.php | 0 test.txt | 1 - 2 files changed, 1 deletion(-) create mode 100644 runoob.php delete mode 100644 test.txt $ ls README runoob.php
以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。 合并完后就可以删除分支: $ git branch -d newtest Deleted branch newtest (was c1501a2).
删除后, 就只剩下 master 分支了: $ git branch
合并冲突 合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。 $ git branch
首先,我们创建一个叫做 change_site 的分支,切换过去,我们将 runoob.php 内容改为: <?php echo 'runoob'; ?>
创建 change_site 分支: $ git checkout -b change_site Switched to a new branch ‘change_site’ $ vim runoob.php $ head -3 runoob.php <?php echo 'runoob'; ?>
$ git commit -am ‘changed the runoob.php’ [change_site 7774248] changed the runoob.php 1 file changed, 3 insertions(+)
将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的(空文件,没有代码),我们再次修改 runoob.php 文件。 $ git checkout master Switched to branch ‘master’ $ cat runoob.php $ vim runoob.php # 修改内容如下 $ cat runoob.php <?php echo 1; ?>
$ git diff diff --git a/runoob.php b/runoob.php index e69de29…ac60739 100644 — a/runoob.php +++ b/runoob.php @@ -0,0 +1,3 @@ +<?php +echo 1; +?> $ git commit -am ‘修改代码’ [master c68142b] 修改代码 1 file changed, 3 insertions(+)
现在这些改变已经记录到我的 “master” 分支了。接下来我们将 “change_site” 分支合并过来。 $ git merge change_site Auto-merging runoob.php CONFLICT (content): Merge conflict in runoob.php Automatic merge failed; fix conflicts and then commit the result.
$ cat runoob.php # 打开文件,看到冲突内容 <?php <<<<<<< HEAD echo 1; ======= echo 'runoob'; >>>>>>> change_site ?>
我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。 $ vim runoob.php $ cat runoob.php <?php echo 1; echo 'runoob'; ?>
$ git diff diff --cc runoob.php index ac60739,b63d7d7…0000000 — a/runoob.php +++ b/runoob.php @@@ -1,3 -1,3 +1,4 @@@ <?php +echo 1; + echo 'runoob'; ?>
在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决 $ git status -s UU runoob.php $ git add runoob.php $ git status -s M runoob.php $ git commit [master 88afe0e] Merge branch ‘change_site’
现在我们成功解决了合并中的冲突,并提交了结果。
|