(转载)git
git基本概念
- 工作区:仓库的目录。工作区是独立于各个分支的。
- 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
- 版本库:存放所有已经提交到本地仓库的代码版本
- 版本结构:树结构,树中每个节点代表一个代码版本。
git常用命令
全局设置
git config --global user.name xxx
:设置全局用户名,信息记录在~/.gitconfig
文件中git config --global user.email xxx@xxx.com
:设置全局邮箱地址,信息记录在~/.gitconfig
文件中git init
:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
常用命令
git add XX
:将XX文件添加到暂存区git add .
:将所有待加入暂存区的文件加入暂存区
git commit -m "给自己看的备注信息"
:将暂存区的内容提交到当前分支git push -u (第一次需要-u以后不需要)
:将当前分支推送到远程仓库git pull
:将远程仓库的当前分支与本地仓库的当前分支合并git clone git@github.com:xxx/XXX.git
:将远程仓库XXX下载到当前目录下
git status
:查看仓库状态git diff XX
:查看XX文件相对于暂存区修改了哪些内容git log
:查看当前分支的所有版本git branch
:查看所有分支和当前所处分支
工作区&暂存区的其他命令
git rm -f file_name
:同时从工作区和索引中删除文件。即本地的文件也被删除了。git rm --cached
:从索引中删除文件。但是本地文件还存在, 只是不希望这个文件被版本控制。git restore XX
:使用暂存区的文件覆盖工作区中的文件(即从暂存区回滚)git restore --staged XX
:--staged
表示对暂存区进行操作,撤销对于暂存区中XX文件最近一次的操作(例如:rm XX,使用后暂存区中该文件会恢复,add新文件,使用后该文件从暂存区中删除,add修改后的文件,使用后会恢复未修改的版本)
版本库相关命令
git reflog
:查看HEAD
指针的移动历史(包括被回滚的版本,可通过此条指令查找被回滚的版本的Hash值)git reset HEAD^ or hash_id
:只是将git仓库中的节点进行了回退,将HEAD指向了上一个版本,暂存区会变为上一个版本,本地工作区不变git reset --hard HEAD^
或git reset --hard HEAD~
:不但将本地的HEAD指针指向了上一个版本,重置了暂存区的内容,而且还修改重置了本地工作区的内容- 使用时要慎重,如果本地工作区修改了没提交,那使用了这条命令之后这些修改就没了
git reset --hard HEAD^^
:往上回滚两次,以此类推git reset --hard HEAD~100
:往上回滚100个版本git reset --hard 版本号
:回滚到某一特定版本- windows下因为cmd控制台中换行符默认是
^
,所以得加引号git reset --hard "HEAD^"
- windows下因为cmd控制台中换行符默认是
将本地仓库关联到远程仓库
-
git remote add origin git@github.com:用户名/项目名.git
:将本地仓库关联到远程仓库- 首先需要在云端添加本地生成的SSH公钥,随后在本地仓库文件夹下执行此条命令
-
git push origin branch_name
:将本地branch_name
分支推送到远程仓库的origin/branch_name
分支 -
git push --set-upstream(-u) origin branch_name
:设置本地的branch_name
分支关联远程仓库的origin/branch_name
分支,并将远程分支设置为上游分支。之后只需要使用git push
命令即可将本地分支的修改推送到上游分支。--set-upstream
和-u
的作用相同
协作开发相关命令
多人协作开发,或者自己使用两台电脑通过云端进行协同都需要这一部分
过程如下:
git clone git@github.com:xxx/XXX.git
:将远程仓库XXX下载到当前目录下,会将master
分支克隆下来- 一般不在
master
分支上开发,假设在dev
分支上开发,开发完成后再合并到master
分支,所以需要将dev
分支克隆下来
git checkout branch_name
: 切换到branch_name分支上git checkout -b branch_name
:创建并切换到branch_name
这个分支git pull origin branch_name
:将远程仓库的branch_name
分支与本地仓库的当前分支合并
3.在dev
分支上修改,并提交和master
分支合并的申请
多分支相关命令
git checkout -b branch_name
:创建并切换到branch_name
这个分支git checkout branch_name
:切换到branch_name
这个分支
使用git checkout branch_name
进行分支切换时,会将branc_name分支版本库的最新文件同步到暂存区和工作区,因此最好保证当前分支的工作区、暂存区和版本库中的最新提交是一致的,否则这些未提交的修改就会被覆盖掉。
如果切换前原分支的工作区文件内容与暂存区中不同,或暂存区中文件与版本库中最新提交文件不同,而这些不同的文件名如果满足下列情况则被认为不能安全切换分支而需要使用“ git checkout -f 分支名 ”命令来强制切换:
- 这些内容不一致的文件在原分支的版本库(最新)中已存在;
2.这些内容不一致的文件在要被切换到的分支的版本库(最新)中已存在;
之所以会认为这两种情况为不安全切换是因为在分支切换时要进行的两个操作:
- 原分支切换时会将工作区、暂存区中与版本库中同名文件(路径+名称)进行删除;
2.被切换分支在切换时会将版本库中文件同步到工作区、暂存区中;
因此满足上面的两个不安全切换条件时不能安全的进行分支切换,如果使用“ git checkout -f 分支名 ”进行强制切换那么原分支下的工作区和暂存区中不满足安全切换的那些文件将丢失(被删除或被覆盖)。
当想要修改并提交新节点时,一定要先切换到想要提交的分支后再进行修改
git branch branch_name
:创建新分支git branch
:查看所有分支和当前所处分支git branch -d branch_name
:删除本地仓库的branch_name
分支git merge branch_name
:将分支branch_name
合并到当前分支上(快速合并)- 根据两个分支的不同状态,这种合并又分为快速合并和三路合并,参考链接
合并可能会产生冲突,解决冲突后,再提交新版本,才完成本次合并
1 11111
2 dfsfd
3 <<<<<<< HEAD # 当前分支的内容(下)
4 77777
5 ======= # 分割线
6 99999
7 >>>>>>> dev # 合并分支的内容(上 )
git push --set-upstream origin branch_name
:设置本地的branch_name
分支对应远程仓库的branch_name
分支git push -d origin branch_name
:删除远程仓库的branch_name
分支git pull
:将远程仓库的当前分支与本地仓库的当前所处分支合并git pull origin branch_name
:将远程仓库的branch_name
分支与本地仓库的当前分支合并git branch --set-upstream-to=origin/branch_name1 branch_name2
:将远程的branch_name1
分支与本地的branch_name2
分支对应,方便直接git pull
拉取下来
暂存栈相关命令
git stash
:将工作区和暂存区中尚未提交的修改存入栈中git stash apply
:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素git stash drop
:删除栈顶存储的修改git stash pop
:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素git stash list
:查看栈中所有元素
设置文件不上传
一般git只上传代码,其他的编译、配置文件不上传
方法:
在git仓库的根目录下 vim .gitignore
在文件里面写上 */文件名
再去添加文件的时候就不会再添加这类不必要的文件
作者:yxc
链接:https://www.acwing.com/file_system/file/content/whole/index/content/2932078/
来源:AcWing