https://www.liaoxuefeng.com/wiki/896043488029600/902335212905824学习笔记
Git是目前世界上最先进的分布式版本控制系统。
Git跟踪并管理的是修改,而非文件。所以快
设置用户名git config --global user.name "Your Name"
设置邮箱git config --global user.email "email@example.com"
本地仓库
git init
创建本地仓库。生成的.git目录是git的版本库。默认会创建一个master分支,如果没有创建其他分支,以下操作都是基于master分支。
git add <file>
把文件修改添加到暂存区,可以多次add不同文件。在当前仓库创建一个readme.txt文件,git add readme.txt
并添加到仓库,
git commit -m <message>
把暂存区的所有内容提交到当前分支。git commit -m '初始化'
这样就可以追踪到文件变化了。
每次的修改都要先add到暂存区,再commit到分支。
git log
查看历史提交版本记录。git log --pretty=oneline
查看简化的历史提交版本记录git reset --hard HEAD^
回退到上一个版本(上一次commit提交的版本),HEAD
指向的是当前版本,上一个版本HEAD^
,上上个版本HEAD^^
,往上3个版本HEAD~3
。如果版本回退了,在用git log
查看就看不到当前版本之后的提交记录了,再想回到之前最新的版本,需要找到那条提交记录commit_id。git reflog
查看每一次的提交记录。和git log
有区别git reset --hard commit_id
回到某个版本git status
查看仓库状态,工作区是否有修改没有添加到暂存区,是否有修改没有提交到分支等git diff HEAD -- <file>
查看当前工作区和版本库中(暂存区和分支)的内容区别。git checkout -- <file>
放弃工作区的改变。1. 如果修改还未add到暂存区,就会回到和版本库一样的状态,2. 如果add后发生了修改,就会回到add后的状态。简而言之就是把工作取到的内容恢复到和版本库一样。git reset HEAD <file>
撤销暂存区的添加,撤销上一次的add撤销add,撤销修改记录,回退版本。
当删除文件时,可以用
git rm <file>
,和git add <file>
效果一样
撤销:
- 撤销commit
- 撤销git commit,撤销git add,保留编辑器改动代码
git reset --mixed <commit ID>
或git reset <commit ID>
- 撤销gitcommit,不撤销git add,保留编辑器改动代码
git reset --soft<commit ID>
- 撤销gitcommit,撤销git add,删除编辑器改动代码
git reset --hard <commit ID>
- 撤销add。add了还没提交,就使用
git reset HEAD <file>
回到提交前 - 撤销工作区的修改。
- 如果没有add和commit,就使用
git checkout -- <file>
或git checkout .
放弃工作区的修改 -
git clean -xdf
删除git没有追踪的文件(编译构建生成的中间文件,可以用此命令删除)
远程仓库
建立远程仓库,如github
git remote add origin git@github.com:della526/gitlearn.git
把远程仓库地址关联到本地,并起个名字origin,之后在本地就可以通过origin代替一连串的远程地址。
git remote -v
查看远程库信息,可以pull抓取和push推送的远程地址。如果没有推送权限就看不到push地址。
git remote rm origin
删除远程仓库origin的关联。此处删除并不是删除远程库,只是删除和远程库的关联。
git push -u origin master
把当前本地版本库中当前分支的内容push到远程仓库origin的master分支。第一次push时,加上-u
,之后再push推送时就直接git push
不用再加<远程仓库名字> 和<远程仓库分支>了。
git push origin <分支名>
对当前分支推送到远程分支
当不指定分支名直接git push
或git pull
失败时,可以这样设置一下关联你指定要推送对的远程分支git branch --set-upstream-to=origin/dev dev
分支
git branch dev
本地创建分支dev
git checkout dev
本地切换到/检出dev分支 新版本 git switch <name>
git checkout -b dev
加上-b
相当于做了两件事情,创建dev分支并切换到该分支。创建dev分支并切换到该分支。新版本git switch -c <name>
git branch
查看分支,及当前分支.带*
号的就是当前所在分支。
add并commit提交dev的修改内容。然后切换到 master分支。
git merge dev
,把dev分支的提交内容合并到当前分支(master)。git branch -d dev
删除dev分支git branch -D dev
强行删除分支,没有被合并过的分支需要强行删除因为创建、合并、删除分支特别快,所以在做某个任务时,检验使用分支,合并后删除分支
sourcetree中提示超前一个版本的,意思是本地版本比远程版本更新一个版本。
如果两分支在merge时发生冲突(如修改了 同一个文件同一处代码),先处理冲突,把冲突文件处理为我们想要的内容 ,再add和commit。
git log --graph --pretty=oneline --abbrev-commit
查看分支合并情况。更详细内容git log --graph
git checkout -b dev origin/dev
创建和远程dev相关联的本地分支dev,新来的小伙伴从远程库clone时,只能看得到master分支,他要修改dev上的内容,就得创建个本地dev分支,并且和远程dev相关联。然后add,commit提交,push推送git push origin dev
注意
,的多人合作的项目,在push前先pull远程最新的代码git pull origin dev
,若拉下后有冲突,先解决冲突,再add提交,push推送。
- 合并方式
1、git merge
默认采用Fast-forward快速合并,直接把HEAD指向被合并分支的提交,不会产生新的提交。在这种模式下,删除分支后,会丢掉分支信息,后续就看不出来是否做过合并。
2、--no-ff
强制禁用Fast forward模式,会产生新的提交。需要输入提交信息git merge --no-ff -m '提交信息' dev
。即使删除被合并的分支,后续也能看到合并记录。
image.png
在实际开发中,master一般用于发布正式版本,dev用来开发,属于不稳定版本 ,RD创建各自的任务分支,然后合并到dev。
image.png - 储藏
git stash
储藏当前修改,如果有新增文件,必须先add再stash,stash之能存储在版本库中的文件。(场景:当前分支没做完不想提交,但又必须切到另一个分支去修改)。
git stash list
查看stash列表,在列表中找到你要取出的储藏的对应索引。
git stash apply stash@{索引}
取出储藏的修改内容,删掉该条stashgit stash drop stash@{index}
。
或者直接使用git stash pop stash@{索引}
(该命令做了两个操作“取出储藏和删除储藏”)。
image.png -
git cherry-pick commit_id
把某个分支的‘修改提交’合并到当前分支。
当某个bug分支提交后,再合并到master,删除bug分支。此时想在dev分支也把这个bug提交的内容 合并过来,但又不想把整个master的内容合过来。此时先通过git reflog
找到bug提交的commit_id,然后执行git cherry-pick commit_id
,就合到dev分支了。