Git is a distributed version control systeam.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
# Git学习

* 初始化Git仓库

    git init

* 添加文件到git仓库

    git add <file> 

    git commit -m <massage>

* 查看工作区状态

    git status

* 查看文件修改内容

    git diff

* 回退到之前的版本

    git reset --hard commit_id

    HEAD指当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^,上100个版本是HEAD~100

* 查看提交历史,以便确认回退到哪个版本

    git log

* 重返未来,查看命令历史,确定回到未来的哪个版本

    git reflog

* git 暂存区

    ![image-20230114154351337](C:\Users\similar\AppData\Roaming\Typora\typora-user-images\image-20230114154351337.png)

* git跟踪记录的是修改,每次修改如果不用git add到暂存区,那么就不会加入到commit中

* 直接丢弃工作区的修改

    git checkout -- <filename>

* 撤销添加到暂存区的文件修改

    1,git reset HEAD <filename>

    2,git checkout -- <filename>

* 已经提交到版本库的修改想要撤销,使用版本回退,前提是没有推送到远程仓库

* 删除文件

    git rm

    如果一个文件已经被提交到版本库,那么不用担心误删,但是只能恢复到最新版本,将会丢失最近一次提交后修改的内容

* 关联远程库

    git remote add origin git@sever_name:path/repo_name.git

    关联远程库必须指定用名,origin是习惯默认用名

    关联后,使用git push -u origin master第一次推送master分支的所有内容

    此后,每次本地提交以后,有必要的话就可以使用命令

    ​	git push origin master推送最新修改

* 克隆仓库

    使用git clone进行仓库的克隆

    git支持多种协议,包括https,但是ssh协议速度最快。

* 查看分支

    git branch

* 创建分支

    git branch <name>

* 切换分支

    git checkout<name> 或者 git switch <name>

* 创建+切换分治

    git checkout -b <name> 或者 git switch -c <name>

* 合并分支到当前分支

    git merge <name>

    当git无法自动合并分支时,必须首先解决冲突,再提交。

    解决冲突就是把Git合并失败的内容手动编辑为我们希望的内容再提交。

* 查看分支合并图

    git log --graph

* 删除分支

    git branch -d <name>

* 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。

* 当手头工作没有完成时,先把工作现场`git stash`一下,然后去修复bug,修复后,再`git stash pop`,回到工作现场;

    在master分支上修复的bug,想要合并到当前dev分支,可以用`git cherry-pick <commit>`命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

    开发一个新feature,最好新建一个分支;

    如果要丢弃一个没有被合并过的分支,可以通过`git branch -D <name>`强行删除。

* 多人协作的工作模式:

    1. 首先,可以试图用`git push origin <branch-name>`推送自己的修改;
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用`git pull`试图合并;
    3. 如果合并有冲突,则解决冲突,并在本地提交;
    4. 没有冲突或者解决掉冲突后,再用`git push origin <branch-name>`推送就能成功!

    如果`git pull`提示`no tracking information`,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream-to <branch-name> origin/<branch-name>`。

    这就是多人协作的工作模式,一旦熟悉了,就非常简单。

* 查看远程库信息

    git remote -v

* 本地新建的分支如果不推送到远程,对其他人不可见。

* 从本地推送分支,使用`git push origin branch-name`,如果推送失败,先用`git pull`抓取远程的新提交;

* 在本地创建和远程分支对应的分支,使用`git checkout -b branch-name origin/branch-name`,本地和远程分支的名称最好一致

* 从远程抓取分支,使用`git pull`,如果有冲突,要先处理冲突。