分布式版本管理工具Git-操作基本命令
git与svn的区别
1 集中式版本管理工具
2 分布式版本管理工具
3 svn与git的区别
**集中式(**SVN) | **分布式(**Git) | |
---|---|---|
是否有中央服务器 | 有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 | 没有中央服务器,开发人员本地都有 Local Repository |
网络依赖 | 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。 | 分布式在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 到 Remote Repository。 |
文件存储格式 | 按照原始文件存储,体积较大 | 按照元数据方式存储,体积很小 |
版本号 | 全局唯一的连续版本号 | 依据数据计算sha-1的40位哈希值,全球唯一 |
分支操作的影响 | 创建新的分支则所有的人都会拥有和你一样的分支 | 分支操作不会影响其他开发人员 |
提交 | 提交的文件会直接记录到中央版本库 | 提交是本地操作,需要执行push操作才会更新到主版本库 |
应用场景 | 当研发成本比较低,协作开发人数不多,开发人员对于版本管理的水平参差不齐的时候,或者对于代码的安全性要求更高一点的情况下适用 | 对于很多人参与开发,代码量比较大,或者高频次协作,跨公司,跨地域合作的情况下更适用 |
工作原理
工作区workspace
暂存区stage
仓库repository
本地仓库 local repository
远程仓库 remote repository
本地仓库中添加一个文件
touch demo.txt # linux环境在本地仓库中添加一个文件
echo text > demo.txt # windows环境在本地仓库中添加一个文件,linux环境添加内容到指定文件中
git add -A # 添加未提交的文件到暂存区。后面可以跟文件名,多个文件用空格分开。
gitadd -A 提交所有变化;
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new);
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git commit -m "test commit" # 提交文件
git push origin master # 推送文件到远程服务器。第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,git push就行
从远程仓库拉取
git pull origin master # git pull <远程主机名> <远程分支名>:<本地分支名>
相当于git fetch和git merge两条指令
git fetch origin master
git merge origin/master # 这两个指令等同于上述git pull指令
查看仓库状态
git status # 查看仓库状态
检查历史
git log # 查看本地仓库
git log origin/master # 查看服务器仓库
git reflog # 查看命令历史
文件比较
git diff demo.txt # 查看文件修改内容
git diff HEAD "HEAD^" # 比较两个版本的不同,后面可以跟文件名参数
版本回退
git reset --hard "HEAD^" # 回退到上一个版本。git是用HEAD来表示当前分支中的当前版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,以此类推,如果要回退很早的版本就用HEAD@{版本号}
–mixed
默认项。修改版本库,修改暂存区,保留工作区。会清空暂存区的修改。
–soft
修改版本库,保留暂存区,保留工作区。只需要commit即可恢复版本回退前的状态。
–hard
修改版本库,修改暂存区,修改工作区 。回退最彻底的一种。
撤销修改
分三种情况
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file 或者手动修改。
场景2:当你不但改乱了工作区某个文件的内容,并且还添加到了暂存区(即已经git add 了)时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步 按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以用版本回退,不过前 提是没有推送到远程库
分支
列出本地分支
git branch
查看远程分支
git branch -r
查看全部分支
git branch -a
创建分支
git branch dev # dev为新分支的名字,此命令创建分支后仍会停留在当前分支.
删除分支
git branch -d dev # 删除分支。如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支。
分支改名
1 git branch -m oldName newName
Checkout
操作文件
git checkout filename # 放弃单个文件的修改
git checkout . # 放弃当前目录下的修改
操作分支
git checkout master # 将分支切换到master
git checkout -b master # 如果分支存在则只切换分支,若不存在则创建并切换到master分支.
合并分支
git merge 分支名
将指定分支的内容合并到当前分支中
git merge dev # 将分支dev合并到当前分支
分支的合并
快速合并:对应代码没有冲突的情形
非快速合并:对应代码有冲突的情形
对于非快速合并,发生冲突后需要人工解决冲突,然后再将解决后的文件添加到暂存区,继而提交到本地仓库中就可以了,此时不必画蛇添足再去二次执行merge合并命令。
git add 冲突文件名
git commit -m "冲突修复说明"
解决完后如果被合并的分支不需要了,可以进行删除分支的操作。我们可以通过下面的命令查看冲突解决情况
git log --graph --pretty=oneline
问题解决
执行git push时遇到如下错误
Counting objects: 3, done.
Writing objects: 100% (3/3), 228 bytes | 228.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to
repository database ./objects
remote: fatal: failed to write object
error: remote unpack failed: unpack-objects abnormal exit
To jacky-vpc:/home/git/woniuboss.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'git@jackyvpc:/home/git/woniuboss.git'
问题原因:
因为项目的woniuboss.git 目录有些文件夹的权限是root用户。
解决方案:
服务器端执行命令
chown -R git:git /home/git/woniuboss.git
利用git进行push时遇到如下错误
Push rejected,Push to origin/master was rejected
refusing to merge unrelated histories
解决方案:
首先执行pull命令允许两个不相关的仓库合并
git pull origin master –-allow-unrelated-histories
利用git进行pull时遇到如下错误
error: The following untracked working tree files would be overwritten
by merge:
解决方案:
首先执行clean命令清除未加入git管理的文件
git clean -d -fx
git push 时如果出现如下错误
refusing to update checked out branch: refs/heads/master
解决方案:
这个错误主要是因为远程仓库创建的时候没有使用–bare选项
第一种方法:
解决这个冲突需要将远程仓库当前分支切换到其他分支(如谁也不会使用的分支)。
第二种方法:
这是由于git默认拒绝了push操作,需要进行设置,修改 .git/config 添加如下代码:
[receive]
denyCurrentBranch = ignore
在服务器上运行
git config receive.denyCurrentBranch ignore
git push 时如果出现如下错误
error: insufficient permission for adding an object to repository
database ./objects
解决方案:
这个错误主要是因为远程仓库创建的时候版本库所在目录的没有写权限,导致新的文件无法上传。 在服务器上补充执行下面的命令
chown -R git:git /home/git/.ssh/woniuboss.git
利用git将文件添加到暂存区后执行了git reset --hard指令,可以利用下面的指令恢复
git fsck --lost-found
指令执行后在.git将生成lost-found目录,在这个目录下的other目录中可以找到之前暂存区中的文 件内容。