赞
踩
之前公司都是使用svn来存储代码,由于最近工作的变动,新公司采用git存储代码,之前虽有耳闻但未使用过。自己从零到可以正常使用也遇到了一些问题,通过网络查到了一些方式。现在整理一下方便小白使用。
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。最初开发git是为了帮助管理Linux内核开发。
Git本地有四个工作区域分别是工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)
下面为在网上找到的图片可以很好的看出其中的关系:
1.Workspace: 工作区,就是你平时存放项目代码的地方。
2.Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
3.Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
4.Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
git安装只需要执行下面命令即可。
sudo apt-get update
sudo apt-get install git
git配置需要执行git config命令
git config --global user.name "runoob"
git config --global user.email test@runoob.com
git config --system user.name "runoob"
git config --system user.email test@runoob.com
global选项和system选项的区别就是配置项的生效范围不同。使用system是在/etc/gitconfig文件中添加配置并对所有用户有效。使用global是在当前目录的主目录下也就是~/.gitconfig文件中添加配置并对当前用户有效,建议使用global选项。使用global选项配置完成可以打开~/.gitconfig文件查看当前配置也可以使用命令行查看配置
git config --list //查看所有配置
git config user.name //查看用户配置
如果有临时配置,比如要在某个特定的项目中使用其他名字或者电邮,只要去掉 global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
这里先了解下常见的git的工作流程:
1.克隆 Git 资源作为工作目录。
2.在克隆的资源上添加或修改文件。
3.如果其他人修改了,你可以更新资源(更新前先将需要进行版本管理的文件放入暂存区域)。
4.在提交前查看修改。
5.提交修改。
6.在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
git管理的文件共有几种状态:
1.Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
2.Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified.如果使用git rm移出版本库, 则成为Untracked文件
3.Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
4.Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified
5.commited:已提交如果提交错了可以使用git reset HEAD^ 去掉上一次的提交(会直接变成Staged状态之前的状态。或者使用git reset --soft HEAD^ 去掉上一次的提交(变成Staged状态)
下图是在网上找到的,画的比较清晰:
由于本文笔者是以了解本地git使用为主并且只有一个电脑,所以笔者在本地搭建了一个git仓库(就叫他git本地远程仓库吧,他的作用就是为了模拟远程仓库而已),所谓的访问git远程仓库只不过是访问远程指定的一个.git目录文件而已,无论你是用ssh,还是http他们只是你访问远程文件的介质。
其实在远程服务器上搭建原理相同,只不过需要设置一下仓库的访问权限,如果支持ssh还需要安装ssh。主要还需要对访问者进行管理,这里不一一细说,搭建这个本地远程仓库的目的就是为了方便我们了解使用git管理本地的项目。一般公司远程仓库都已搭建完成,我们只需要git clone将我们需要的拷贝到本地使用本地内容进行编辑、上传。
下面是创建本地远程仓库的具体操作:
1.自己创建一个用于存放本地远程git仓库文件的目录
mkdir mygittest
2.创建一个.git目录(也叫git仓库)
mkdir myproject.git
3.进入.git目录(myproject.git)并初始化
cd myproject.git
git --bare init //执行完这句你会发现本地多了branches config description HEAD hooks info objects refs文件
这样我们就简单的搭建了一个git本地远程仓库。
下载上传是各位git用户最常用的操作。下面就主要介绍这一部分。
下载:
一般情况我们会先创建一个目录,然后进入该目录打开命令行(保证在当前目录下)首先使用git clone克隆 git 资源。这里工作中使用比较多的是ssh访问远程仓库这样可以配置公钥打到免密的效果。由于我们是在同一台电脑上创建的仓库可以直接访问.git文件。
git clone ~/gittest/server/myproject.git
执行完上面操作后你就会发现当前目录下有myproject这个目录这个里面就是git仓库对应存放的数据。由于我们在创建git仓库时什么都没有所以这个目录下只有一个.git。
touch file //创建一个文件
git add file //将文件添加到暂存区
git commit -m "first commit" //将文件提交到本地库中
此时输入:
git branch -a //差看分支
可以看到本地有一个分支master,它前面有一个星号表示目前处于master分支。
git branch mybranch1 //创建一个本地分支mybranch1
git branch -a //会看见两个分支master和mybranch1
git checkout mybranch1 //从master分支切换到mybranch1
git branch -a //会看见星号出现在了mybranch1前面表示此时分支处于mybranch1分支
下面我们修改file文件内容随便增加点东西并保存文件。
git status //查看工作区与本地仓库之间的差异,会显示file已经修改
git add file //将file文件添加到暂存区
git commit -m "update file" //将add的东西添加到本地库
cat file //会看到文件我们刚刚新增加的信息
git checkout master //切换到master分支
cat file //会发现文件中没有我们刚刚添加的信息
出现这种差异的原因就是master和mybranch1是两个分支,虽然两个分支中此时都存在file文件,但是这个文件是每个分支独立各自管理的。在mybranch1分支中修改的东西不会干扰到master分支。
下面我们将新建的本地分支提交到远程服务器:
git push origin master //将本地master分支提交到远程服务器
git push origin mybranch1 //将本地mybranch1分支提交到远程服务器
git branch -a //查看本地和服务器所有分支remotes/origin/开头的是远程分支
git branch -vv //查看本地分支和远程分支对应关系,也就是本地分支跟踪的是哪个远程分支
通过上面命令会发现本地master分支和远程master分支相关联,但是本地mybranch1分支并没有与远程的mybranch1分支关联。这时候需要我们手动创建关联关系。
git checkout mybranch1 //切换到本地mybranch1分支
git pull //从远程分支更新,由于本地分支没有和远程分支关联。会有一些提示教我们创建关联关系。
git branch --set-upstream-to=origin/mybranch1 mybranch1 //将本地mybranch1分支与远程origin/mybranch1分支关联起来。
git branch -vv //查看本地分支和远程分支对应关系,发现两个分支都和远程分支对应上了
下面说一下合并分支:
首先在mybranch1分支下创建一个新分支mybranch2
git checkout -b mybranch2 //创建本地分支并切换到本地分支mybranch2
git push origin mybranch2 //将本地分支推送到服务器
git branch --set-upstream-to=origin/mybranch2 mybranch2 //将本地分支和远程分支创建关联
修改file文件内容,并提交到mybranch2分支。
git checkout mybranch1
git merge mybranch2 //将mybranch2分支中的内容合并到mybranch1
查看file文件发现在mybranch2分支中修改的file文件内容合并到了mybranch1分支的file文件中。
工作中最常遇到的就是冲突,比如我们mybranch1分支和mybranch2分支中的file文件都有变动,合并时候就会有冲突。此时我们需要在执行git merge报错后去解决冲突,然后使用git add 将文件重新添加到暂存区再执行git commit 完成此次合并。
git merge mybranch2 //将mybranch2分支中的内容合并到mybranch1,此时报错有冲突需要解决
.
. //解决冲突
.
git add . //提交所有发生变动和新增加的文件到暂存区
git commit -m "merge" //提交到本地仓库完成此次合并
还有一种情况当我们的分支想要获得其他分支的指定修改内容而不想获得全部差异内容,我们可以使用cherry-pick来实现。在需要将内容合并进来的分支执行下面语句
git cherry-pick <commit_hash>//将指定的提交commitHash,应用于当前分支,可以在合并过来那个分支通过git log获取
git cherry-pick 分支名 // 转移该分支的最新一次提交
//解决冲突
git add . //相当于解决完冲突提交暂存区内容
git cherry-pick --continue //执行完add不需要执行commit执行该语句将提交内容提交到本地仓库,接下来可以选择使用git push提交到远程仓库
git cherry-pick --abort //放弃合并,回到操作前的样子
git cherry-pick --quit //退出cherry-pick,不回到操作前的样子
删除本地分支执行命令时,处于的分支必须是其他分支,否则会报错。删除本地分支命令如下:
git branch -d mybranch1 //删除本地已经提交的分支
git branch -D mybranch1 //强制删除本地已提交或未提交的分支
删除远程分支:
git push origin --delete mybranch1
分支合并时的冲突处理已经在上面分支合说过了,下面我们说下日常工作中最容易出现的一种场景,几个同事一起修改一个分支上的内容,如果他提交到远程分支了你在提交到远程分支会报错也就是会有冲突,和merge时候类似。下面提供几种冲突处理方法:
假设目前在分支mybranch1中,有两个人同时修改了mybranch1分支中的file文件,另一个人先提交了,我们作为后提交的就会出现冲突。
方法一:
1- 我在工作中出现这种场景会先把我修改的保存一份,在使用下面命令:
git reset --hard origin/mybranch1 //强制将远程分支的内容覆盖本地分支,一定要先把自己写的有冲突的保存一份
然后使用beyond compare进行差分。将我们改的差分到刚刚覆盖的新的本地分支中,然后在提交就不会有冲突了。
2- 可以使用下面命令
git add .
git commit -m " update file "
git push origin mybranch1 //将本地mybranch1分支提交到远程mybranch1分支,此时会报错有冲突
git pull origin/mybranch1 //拉取远程仓库进行自动合并。
如果能自动合并,git会提示auto merge成功,这时可以直接git push origin master;如果不能自动merge,git会提示auto merge失败,需要手动解决冲突。方法如下:
git status //查看冲突情况,然后修改冲突
git status //查看冲突解决情况
git add .
git commit -m //解决冲突的注释说明
git push origin mybranch1 //合并到远程分支
方法二:
1-现将本地代码暂存
git stash
2-将远程代码下载到工作区
git pull --rebase
3-将暂存的本地代码提取到工作区
git stash pop
这里如果出现冲突就需要解决冲突,打开冲突文件可以查看到冲突,解决完冲突
4-提交代码
git add .
git commit -m "log_msg"
git push //不加分支默认提交到本地分支对应的远程分支上
下面介绍下冲突文件处理:
git 中存在冲突的文件会有一下的提示,HEAD为当前最新执行这次后的结果,以=====为分割线下面是最新这次执行之前的结果,你想要保存哪个就将另个一删除即可。
<<<<<<< HEAD
new new new new code
=======
old old old code
>>>>>>> xxxxxxxxxxxxxxxxxxxxxxx
大家都知道checkout我们常用的就是用它切换分支,我们使用git checkout -h可以查看这个命令的帮助
可以发现用法中有两个,一个是我们常用的切换分支,还有一个就是撤销修改。
用法:git checkout [<选项>] <分支> 或:git checkout [<选项>] [<分支>] -- <文件>... -q, --quiet 不显示进度报告 -b <分支> 创建并检出一个新的分支 -B <分支> 创建/重置并检出一个分支 -l 为新的分支创建引用日志 --detach HEAD 从指定的提交分离 -t, --track 为新的分支设置上游信息 --orphan <新分支> 新的没有父提交的分支 -2, --ours 对尚未合并的文件检出我们的版本 -3, --theirs 对尚未合并的文件检出他们的版本 -f, --force 强制检出(丢弃本地修改) -m, --merge 和新的分支执行三方合并 --overwrite-ignore 更新忽略的文件(默认) --conflict <风格> 冲突输出风格(merge 或 diff3) -p, --patch 交互式挑选数据块 --ignore-skip-worktree-bits 对路径不做稀疏检出的限制 --ignore-other-worktrees 不检查指定的引用是否被其他工作区所占用 --recurse-submodules[=<checkout>] control recursive updating of submodules --progress 强制显示进度报告
其实帮助文档中说明的都比较明确,我下面在说下常用用法:
git checkout branch_name //切换到指定分支
git checkout -b branch_name //创建一个新分支并切换到该分支相当于 git banch branch_name + git checkout branch_name
git checkout . //放弃工作区中全部的修改
git checkout -- file_name //放弃工作区中某个文件的修改
git checkout -t origin/<远程分支名> //在本地创建一个和远程分支名相同的本地分支,并切换到该分支
git remote //可以查看远程仓库名
当我们在开发代码时候经常会遇到,测试打过来一个非常着急的bug,如果此时我们不想重新下载仓库,想用现在的仓库进行修改bug,我们就可以使用git stash把我们开发的内容先暂存起来,修改完bug后再将暂存起来的拿出来继续开发。git stash 适用于需要同时开发几个的场景。
git stash //可以将工作区修改到暂存区
git stash save <暂存名称> //可以增加一个暂存的名称以免多个暂存内容不方便区分
git stash pop < stash id> //将指定stash id的内容取出到工作区,如果不指定stash id那么就取出最近一次暂存的内容,并删除在暂存区删除该条记录
git stash apply < stash id > //将指定的 stash id的内容取出到工作区但是并不删除暂存区的该条记录
git stash show < stash id > //查看指定stash id暂存内容变更文件有哪几个
git shash show -p < stash id > //查看变更内容的详细细节(类似于git diff)
git stash branch //从最新的暂存内容创建分支
git stash drop < stash id > //删除暂存区的指定stash id内容
git stash clear //清空暂存谨慎使用
命令 | 解释 |
---|---|
git init | 初始化 |
git clone <要克隆的目录> | 赋值仓库到本地可以是远程的可以是本地的(远程的常见,使用http或者ssh) |
git checkout -b <本地分支名> | 创建本地分支并切换到该分支 |
git branch -a | 查看所有本地远程分支名 |
git branch -vv | 查看本地分支与远程分支关联状态 |
git checkout -t origin/<远程分支名> | 在本地创建一个和远程分支名相同的本地分支,并切换到该分支 |
git status | 查看文件与本地仓库的状态(是否修改等) |
git add <filename> | 将文件添加到暂存区(也可以使用git add .添加所有变动的文件到暂存区) |
git commit -m “msg” | 将暂存区的内容提交到本地仓库(msg为修改登记) |
git push <远程remote> <远程分支名> | 将本地仓库分支提交到远程仓库分支(如果本地分支与远程分支名称相同可以直接使用git push) |
git push <远程remote> --delete <远程分支名> | 删除远程制定remote下的分支 |
git reset --hard origin/<远程分支名> | 强制将本地分支覆盖为远程分支内容,在执行该命令前一定要保存好本地分支自己修改的内容确定无误后执行该命令 |
git log | 查看本地仓库日志可以看到每次提交的commitHash,git log origin/<远程分支名>可以查看远程分支log |
git checkout <commit id> | 可以切换到指定的版本commit id 可以通过git log 查看 |
git reset HEAD <filename> | 将暂存区中的指定文件回退到工作区 |
git reset HEAD^ | 将已经提交到本地仓库中的回退到上一个版本 |
git cherry-pick <当前分支> <指定的提交commitHash(git log可以获取)> | 将其他分支的某次变更合并到当前分支中 |
git revert <commit id> | 可以将指定commit id的提交内容还原,不影响其他commit,revert后git log中会保留一条记录 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。