『千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题。』
git init
命令。git add <file>
,注意,可反复多次使用,添加多个文件;git commit -m <message>
,完成。git status
命令。git diff
可以查看修改内容。git reset --hard commit_id
。(上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,commit id是一个SHA1计算出来的一个非常大的数字,用十六进制表示。)git log
可以查看提交历史,以便确定要回退到哪个版本。git reflog
查看命令历史,以便确定要回到未来的哪个版本。cat readme.txt
查看文本内容。Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
git diff filename
:比较工作区和暂存区。git diff HEAD -- filename
:比较工作区和版本库的最新版本。git checkout -- file
。git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit;删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本git checkout -- test.txt
。
(git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。)
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。
『Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。』
git remote add origin git@server-name:path/repo-name.git
;git push -u origin master
第一次推送master分支的所有内容;git push origin master
推送最新修改。git clone git@server-name:path/repo-name.git
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
git branch
git branch <name>
;git checkout <name>
; 或者git switch ;(新版本)git checkout -b <name>
; 或者git switch -c ;git merge <name>
;git branch -d <name>
;(Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快)
补充:
对于所有分支而言, 工作区和暂存区是公共的。git 切换分支时会把未add或未commit的内容带过去。
git log --graph --pretty=oneline --abbrev-commit
git merge --no-ff -m "msg" dev
『在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。』
git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。(git stash list
查看,用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;用git stash pop,恢复的同时把stash内容也删了;git stash apply stash@{0}
)git cherry-pick <commit ID>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。开发一个新功能feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作的工作模式通常是这样:
git push origin <branch-name>
推送自己的修改;git pull
试图合并;git branch --set-upstream-to=origin/<branch-name> <branch-name>
。查看远程库信息,使用git remote -v
;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致。
git rebase
(只对尚未推送或分享给别人的本地修改执行变基操作清理历史;从不对已推送至别处的提交执行变基操作)
发布一个版本时,我们通常先在版本库中打一个标签(tag)。取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
Git的标签是版本库的快照,它就是指向某个commit ID的指针。(跟分支很像对不对?但是分支可以移动,标签不能移动)
git tag <tagname>
用于新建一个标签,默认为HEAD,也可以指定一个commit id;git tag -a <tagname> -m "msg" commit id
可以指定标签信息;git tag
可以查看所有标签;git show <tagname>
查看标签信息。(标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。)
git push origin <tagname>
可以推送一个本地标签;git push origin --tags
可以推送全部未推送过的本地标签;git tag -d <tagname>
可以删除一个本地标签;git push origin :refs/tags/<tagname>
可以删除一个远程标签。git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
先删除已关联的名为origin的远程库:git remote rm origin
git remote add github
git@github.com:path/repo-name.git
git remote add gitee
git@gitee.com:path/repo-name.git
忽略某些文件时,需要编写.gitignore
;
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
git config --global alias.<new> old
–global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
比如:
笔记整理自廖雪峰老师的Git教程。
同时发现一个Git的图文互动的学习网站,特别形象生动,在github上也有相应的开源项目:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务