创建版本库(又名仓库,repository),可以理解为一个仓库,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
<span style="color:#3366ff">1.
$ mkdir learngit
$ cd learngit
$ pwd2.
初始化一个Git仓库,使用git init命令。3.
添加文件到Git仓库,分两步:第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;(多次add不同的文件)第二步,使用命令git commit,完成。(commit可以一次提交很多文件)4.
随时掌握工作区的状态,使用git status命令。如果git status告诉你有文件被修改过,用git diff可以查看修改内容。</span>
5. 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
git reset --hard commit_idgit reset --hard head^(回到上一个版本)git reset --hard 版本号(回到未来或过去都可以)
6. 只是指针在变化:
7. 版本库的管理
8. 为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
9. 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时(还没add之前),用命令git checkout -- file(--前后各有一个空格)
。git checkout -- readme.txt
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。git reset head readme.txt git checkout -- readme.txt
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
git reset --hard 版本号
10.
vim test.txt(退出方式:i(表示插入),esc准备退出。ZZ,保存并退出;:q!(不保存退出)
git add test.txt git commit -m"add a new file"
想要从版本库中删掉该文件:git rm test.txt, git commit -m"delete the test.txt"
命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
11. 远程仓库:
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;(git remote add origin ....)关联后,使用命令git push -u origin master第一次推送master分支的所有内容;(git push -u origin master)此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;(git push origin master)
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;(git push origin master)
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
git和SVN的区别:
Git和SVN还是挺像的,都有提交,合并等操作
下面是区别:
1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;
2. Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
3. Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的;
4. Tortoise也有出Git版本;
5. SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。
参考博文:https://blog.csdn.net/a117653909/article/details/8952183
12. 远程仓库的克隆:
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快
13。 分支管理;
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
14. 创建合并分支:
Git鼓励大量使用分支:
查看分支:git branch(git branch)
创建分支:git branch <name>(git checkout -b dev)
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>(git merge dev)
删除分支:git branch -d <name>(git branch -d dev)
15. 解决合并的冲突:
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令可以看到分支合并图。
16. 不使用fast forword方式来合并分支:
17. bug分支管理:
修复bug时,我们可以通过创建新的bug分支进行修复,然后合并,最后删除;git checkout -b dev; git merge dev;
git checkout master;git branch -d dev
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场
git stash ; git stash list; git stash pop;git stash list.
18. feature分支:
开发一个新feature,最好新建一个分支;git checkout -b dev; git add test.txt;git commit -m"add a test.txt";git checkout master;git merge dev之前
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。git branch -D dev(强行删除)
19. 多人协作:
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name
推送自己的修改;git push origin dev -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;(如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。)git branch --set-upstream dev origin/dev;git pull -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!git push origin dev
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
总结:
-
查看远程库信息,使用
git remote -v
; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; -
从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
20. 创建标签
-
命令
git tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id;git tag v1.0 fedsf1 -
git tag -a <tagname> -m "blablabla..."
可以指定标签信息;git tag -a v0.9 -m "add a new tag" -
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签; -
命令
git tag
可以查看所有标签。
21. 操作标签
-
命令
git push origin <tagname>
可以推送一个本地标签;git push origin v1.0 -
命令
git push origin --tags
可以推送全部未推送过的本地标签;git push origin --tags -
命令
git tag -d <tagname>
可以删除一个本地标签; git tag -d v1.0 -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签git push origin :refs/tags/v1.0
22. 使用github
-
在GitHub上,可以任意Fork开源仓库;fork之后使用:git clone git@github.com:linhj-james/learngit-1.git
git@github.com:linhj-james/learngit-1.git
git@github.com:linhj-james/learngit-1.git
-
自己拥有Fork后的仓库的读写权限; pull request
-
可以推送pull request给官方仓库来贡献代码。
23. 最后,供上版本管理常用命令:
git clone git@github.com:linhj-james/learngit.git(你的远程地址)
git init (初始化一个新建的仓库)
git status (所在文件夹的文件状态)
git diff(显示两次文件的修改的不同之处)
git add (+filename)
git commit -m"add some chages"
git log(显示记录)
git branch (查看分支)
git checkout -b dev(新建并切换到另一个分支dev分支去)
git branch master (切换到master分支去)
git branch -d dev(删除dev分支)、
git tag v1.0(贴上v1.0的标签)
git remote -v(查看远程里连接的状态)
(git remote add origin (远程仓库地址))
git remote show <remote>(显示remote的信息)
git pull <remote><branch>(看上面)
git fetch <remote>
git push <remote><branch>(git push origin maste)
git merge <branch>(dev)
git rm <resolved files>
git reset --hard head^
自己总结一下常用 的操作:
一。 . 上传本地文件到github
步骤:
1. 先各自在远程仓库和本地仓库建一个文件夹(仓库)
2. git init(初始化仓库)
3. git add (+文件名)
4. git commit -m"add a new file"
5.git remote -v(查看远程仓库的连接情况,把无关的git remote rm origin(移出掉))
6. git remote add origin (+远程仓库地址)(建立远程仓库)
7. git pull --rebase origin master
(
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase(创建一个新的虚拟提交R)(关于git merge和git rebase 的区别可以参考:https://www.cnblogs.com/kevingrace/p/5896706.html)
)
8. git push -u origin master(有时候会出错,如果排除7的问题可以使用:git push -f origin master(利用本地分支去覆盖远程仓库))
新手如何提交本地文件到github上,几步走:
1、本地创建文件夹,创建本地仓库,【git init】;
2、执行【git add .】,将文件都提交到仓库;
3、执行【git commit -m "注释语句"
】命令,将索引内容添加到仓库中;
4、在github上创建一个repository;
5、将本地的仓库关联到Github上,git remote add origin https://github.com/……(你的用户名)/Test.git(你项目的名字)
6、上传代码到github远程仓库,git push -u origin master
二。 克隆:
git clone (+远程仓库地址)
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000(转载博文)