git用法

Git教程(https://www.liaoxuefeng.com/wiki/896043488029600/896202815778784)
• 分布式版本控制系统
• Git安装 mac os x:就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
• 1) 创建版本库/仓库(repository)
mkdir learngit
cd learngit
pwd
/Users/congrui/learngit
执行完命令后:我的仓库位于:/Users/congrui/learngit
2)通过git init命令把这个目录编程GIT可以管理的仓库:

目录.git是来跟踪版本库的,不许手动修改!!!(ls -ah可以查看到.git目录)
(1)新建readme.txt文件,放在learngit 目录下
(2)git add reade.txt ,告诉git,把文件添加到仓库。
(3) git commit -m “wrote a readme file”告诉git,把文件提交到仓库,-m后面输入的是本次提交的说明,输入有意义的说明以方便找到改进记录。
小结:a.初始化一个git仓库,使用git init命令;b.添加文件到git仓库分两步:git add 可反复多次使用,添加多个文件;Git commit -m ,完成。
• 时光穿梭机:
• git status:掌握仓库当前状态,是否被修改、提交等等;
• git diff readme.txt :查看修改具体内容,提交前查看一下,了解修改了什么
• git add readme.txt: 添加修改
• git status:在运行一下看看当前仓库状态,会告诉我们将要被提交的修改包括readme.txt
• git commit -m “what”:提交修改
• git status:看看当前状态
4.1版本回退
git log 显示从远到近的提交日志;
git log –-pretty=oneline 显示版本号+修改信息的日志;
git reset –-hard HEAD^ :回退到上一个版本HEAD,回退到上上版本HEAD^,HEAD~100
注意:git版本回退速度很快原因:git内部有个指向当前版本的HEAD指针,版本回退时仅仅把HEAD指向回退的版本。
git reflog:记录版本回退的命令
小结:HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
• 工作区和暂存区
Working directory
Repository 版本库(.git):最重要的是称为stage的暂存区,还有git为我们创建的第一个分支master,以及指向master的一个指针head。

image.png

git add 把文件修改添加到暂存区;git commit 把暂存区所有内容提交到当前分支,往master分支上提交更改。提交之后暂存区是干净的,什么都没有了。
git diff 比较的是工作区文件与暂存区文件的区别(上次git add 的内容)
git diff HEAD –-readme.txt:查看工作区和版本库里面最新版本的区别
• 管理修改
第一次修改 -> git add -> 第二次修改 -> git commit: Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。小结:对于每次修改,如果不用git add 到暂存区,那就不会加入到commit中。
• 撤销修改
git checkout –-readme.txt:把readme.txt文件在工作区的修改全部撤销,两种情况:
• readme.txt自修改后还没有被存放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
• readme.txt 已经添加到暂存区后,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之:就是让这个文件回到最近一次git commit 或git add 时的状态。
• git reset HEAD readme.txt把暂存区的修改撤销掉,重新放回工作区。
小结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
• 删除文件
删除文件:删除也是一个修改操作,
1)rm test.txt
一种情况:确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit;
小提示:先手动删除文件,然后使用git rm 和git add效果是一样的。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
• 远程仓库:GitHub提供git仓库托管服务的~远程仓库。
Github设置ssh,密码部分最好一路回车,不然后面需要多次输入密码,很麻烦
5.1添加远程库:在本地创建了一个git仓库后,又想在GitHub创建一个git仓库,让这两个仓库远程同步,GitHub上的仓库可以协作或者备份。
1)github上创建一个库:在GitHub上create a new repo—repo name—create repo
2)在本地仓库下运行命令:
git remote add origin [email protected]:kya8547/learngit.git
远程库名字:origin。(会有ssh警告,yes回车即可)
3)git push -u origin master第一次push加上-u参数,后面可以省略!提交作业
4)删除远程库:(1)git remote -v 查看远程库信息
(2)git remote rm origin 例:删除origin
小结:要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。
5.2从远程库克隆:2种方法,git clone (ssh协议最快)+ 链接https
Ssh方法:

  1. git clone [email protected]:kya8547/kyalearn_0910.git

  2. cd kyalearn_0910

  3. ls可以查看内容
    • 分支管理:
    6.1创建与合并分支:每次提交,git都把它们串成一条时间线,这条时间线就是一个分支,主分支master分支。
    首先,创建dev分支,然后切换到dev分支:
    git checkout -b dev:加上-b参数表示创建并切换;
    git branch:查看当前分支,git branch命令会列出所有分支,当前分支前面会标一个*号。
    git add readme.txt
    +git commit -m "branch test"在dev分支上正常修改提交
    git checkout master:切换回master分支:'
    切换回master分支后,再查看readme.txt文件会发现刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变
    git merge dev:把dev分支的工作成果合并到master分支上
    合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
    git branch -d dev:合并完成后,就可以放心地删除dev分支了
    git branch:删除后,查看branch,就只剩下master分支了
    1)因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
    2)我们注意到切换分支使用git checkout ,而前面讲过的撤销修改则是git checkout -- ,同一个命令,有两种作用,确实有点令人迷惑。实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:
    创建并切换到新的dev分支,可以使用: git switch -c dev
    直接切换到已有的master分支,可以使用: git switch master
    使用新的git switch命令,比git checkout要更容易理解。
    小结
    Git鼓励大量使用分支:
    查看分支:git branch
    创建分支:git branch
    切换分支:git checkout 或者git switch
    创建+切换分支:git checkout -b 或者git switch -c
    合并某分支到当前分支:git merge
    删除分支:git branch -d
    6.2解决冲突
    当git 无法自动合并分支时,就必须首先解决冲突,解决冲突后,在提交,合并完成
    结局冲突就是把git合并失败的文件手动编辑为我们希望的内容,在提交。
    用git log –graph 可以看到分支合并图,$ git log --graph --pretty=oneline --abbrev-commit 看简单明了的分支合并图
    6.3分支管理策略
    git 分支十分强大,适合团队协作
    合并分支时,加上—no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经合作过。
    git merge --no-ff -m "merge with no-ff" (-m,把commit描述写进去)dev(分支)
    6.4 bug分支
    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
    在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
    6.5feature分支
    开发一个新feature,最好新建一个分支;
    如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
    6.6多人协作
    多人协作的工作模式通常是这样:
    首先,可以试图用git push origin 推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/
    这就是多人协作的工作模式,一旦熟悉了,就非常简单。
    小结
    查看远程库信息,使用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,如果有冲突,要先处理冲突。
    6.7rebase
    rebase操作可以把本地未push的分叉提交历史整理成直线;
    rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
    • 标签管理
    命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id(git tag v0.9 f52c4332);
    git show v0.9:查看标签具体信息
    命令git tag -a -m "blablabla..."可以指定标签信息;
    命令git tag可以查看所有标签。
    命令git push origin 可以推送一个本地标签;
    命令git push origin --tags可以推送全部未推送过的本地标签;
    命令git tag -d 可以删除一个本地标签;
    命令git push origin :refs/tags/可以删除一个远程标签。
    • 使用GitHub
    在github上,可以任意fork开源仓库;自己拥有fork后的仓库的读写权限;可以推送pull request给官方仓库来贡献代码。

    • 使用gitee:国内git托管服务
    • 使用source tree Source tree 牛批!!!解放---2021.9.11

你可能感兴趣的:(git用法)