标签:自己 直接 控制系统 为我 auto ack 好的 some 最新版
Git是分布式版本控制系统。如果你和同事同时修改了A文件,那么只需要把A文件的修改推送给对方就可以了。
Svn,Cvs是集中式版本控制系统。需要联网才能工作。从中央服务器下载最新代码,并把修改上传到中央服务器。
和集中式版本控制系统相比,Git分布式版本系统的安全性要高得多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏了可以从其他人那里复制。而集中式版本库的中央服务器挂了,所有人都无法工作。
版本库(repository):版本库中的所有文件都可以被Git管理起来,每个文件的修改、删除 Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻“还原”。
创建版本库:
1. 在要创建git版本库的文件夹上执行命令: git init
命令执行完成后,会看到一个.git目录,默认是隐藏的。
把文件添加到版本库:
文件建议使用编辑器,如NotePad++书写。方便修改编码方式 --UTF-8
添加文件到仓库命令:
git add test.txt
文件提交到仓库命令:
git commit -m "add a txt" -- 会提交git跟踪到的所有修改文件
退回版本库:
查看仓库当前的状态状态命令:
# 这个命令可以告诉我们有哪些文件被修改了,哪些文件被删除了等等
git status
查看具体修改内容:
git diff test.txt
查看提交信息:
git log
退回版本:
git reset -hard HEAD^ -- ^代表退回上一个版本
git reset -hard ~100 -- ~100往上一百个版本
每次commit都会自动生成一个id,也可以使用id退回版本
git reset -hard 1094a
Git版本退回非常快,因为Git在内部有一个指向当前版本的指针,当你退回版本的时候,Git仅仅是把HEAD指针指向了其他版本。
注:当退回版本以后,git log只能查看可以回退的版本,不能查看向前的版本,如果向要查看,要使用 git relog查看所有的提交命令
Git工作区、暂存区:
工作区:就是你在电脑里能看到的目录
版本库:隐藏目录.git
git版本库中存贮了很多信息,其中最重要的就是stage的暂存区,还有Git为我们建立的第一个分支master,以及指向master的HEAD
git add、git commit命令含义:
git add 实际就是把文件修改添加到暂存区;
git commit 实际就是把暂存区的所有内容提交到当前分支。
Git修改文件:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
Git撤销修改:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
Git删除文件:
删除文件后运行命令
git rm <file>
git commit
若删除文件后发现删错了
git checkout -- <file> 把误删的文件修改到最新版本
Git分支:
创建分支,并切换
git checkout -b dev
git checkout -b dev 相当于:
git branch dev 创建
git checkout dev 切换
查看当前分支
git branch
创建之后我们就可以在dev分支上正常提交
dev分支工作完成时,我们就可以切换回master分支,进行合并
git checkout master
git merge dev
合并完成后,我们就可以删除dev分支了
git branch -d dev
提交冲突
当dev分支提交的修改和master分支提交的修改有冲突时,需要我们手动合并修改,再次提交。
查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
分支管理
分支合并后、删除dev分支会丢失分支信息。使用 --no-ff保存分支信息。
git merge --no-ff -m "merge with no-ff" dev
Bug分支
当工作中出现bug需要马上解决,但是手动新的代码还不能提交,可以使用stash功能。
当分支中stash一下,假设当前分支为dev
git stash
切换到需要修改bug的分区
git checkout master
创建修改bug分支
git checkout -b issue-101
提交
git add readme.txt
git commit -m "fix bug 101"
合并
git checkout master
git merge --no-ff -m "merged bug fix 101"
切换到原分支工作区
git checkout dev
查看当前stash
git stash list
把缓存的dev分支上的修改找回
git stash apply
删除stash
git stash drop
或者直接使用pop恢复并删除stash
git stash pop
Feature分支
分支上的修改没有合并时,若想删除改分支,执行以下命令
git branch -D <name>
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
git remote
或者,用git remote -v显示更详细的信息:
git remote -v
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
git push origin master
推送到其他分支
git push origin dev
抓取分支
克隆git项目
git clone git@github.com:michaelliao/learngit.git
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看
$ git branch
* master
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
$ git add env.txt
$ git commit -m "add env"
[dev 7a5e5dd] add env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
f52c633..7a5e5dd dev -> dev
你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
$ cat env.txt
env
$ git add env.txt
$ git commit -m "add new env"
[dev 7bd91f1] add new env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$ git push origin dev
To github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to ‘git@github.com:michaelliao/learngit.git‘
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull ...‘) before pushing again.
hint: See the ‘Note about fast-forwards‘ in ‘git push --help‘ for details.
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
Branch ‘dev‘ set up to track remote branch ‘dev‘ from ‘origin‘.
再pull:
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.
这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:
$ git commit -m "fix env conflict"
[dev 57c53ab] fix env conflict
$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
7a5e5dd..57c53ab dev -> dev
因此,多人协作的工作模式通常是这样:
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
标签管理
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
git branch
然后,敲命令git tag
git tag v1.0
可以用命令git tag查看所有标签:
git tag
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
git log --pretty=oneline --abbrev-commit
git tag v0.9 f52c633
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show
git show v0.9
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 1094adb
操作标签
如果标签打错了,也可以删除:
git tag -d v0.1
如果要推送某个标签到远程:
git push origin v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
git push origin :refs/tags/v0.9
使用git
别人好的项目先fork到自己的仓库,再clone到本地。
如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。
如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。
标签:自己 直接 控制系统 为我 auto ack 好的 some 最新版
原文地址:https://www.cnblogs.com/LTEF/p/9757058.html