总体流程
官方参考文档
三个状态:是否追踪(缓存区),是否暂存(暂存区),是否提交commit
- 配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改。
- 如何向你的远程仓库推送(push)以及如何从你的远程仓库拉取(pull)文件。
step1: git init/clone 创建新仓库
step2: 添加新文件xxx.md --> 文件被放到"Untracked files"–> git add xxx.md
将新文件添加追踪,放到暂存区"Changes to be committed" ;
修改文件xxx.md --> 文件被放到"Changes not staged for commit" --> git add xxx.md
将新文件的修改暂存,放到暂存区 “Changes to be committed”
step 3: git commit -m "XXX"
提交更新,也可以跳过step2,git commit -a
(前提是文件都被追踪了)
本地操作
获取git仓库 git init/clone
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
方式一:在已存在目录中初始化仓库,先cd到该目录cd /c/Users/HP/mydir
,再git init
,此时完成了仓库的初始化。
方式二:git clone https://github.com/libgit2/libgit2 XXX
,该命令会在当前目录下创建一个名为 XXX 的目录(如果省略XXX,则会默认命名为“libgit2”),并在这个目录下初始化一个 .git 文件夹。
clone的链接是https协议:
使用https协议,每次pull, push都会提示要输入密码,使用git协议,然后使用ssh密钥,这样免去每次都输密码的麻烦(详见服务器端搭建git):
检查文件状态 git status / git status -s
追踪新文件+暂存已修改的文件 git add
可以理解为将文件放到暂存区(stage),会出现在“Changes to be committed:”里。
- 新创建的文件,通过该命令添加跟踪,将文件加到stage暂存区
- 更改已被跟踪的文件,通过该命令暂存更新,将文件加到stage暂存区
暂存区的文件在下次commit库会一并提交到仓库。
一次性提交多个更改的文件git add .
提交文件 git commit
git commit -m 'change balabala'
忽略文件 cat .gitignore
忽略所有以 .o 或 .a 结尾的文件。
忽略所有名字以波浪符(~)结尾的文件。
查看已暂存和未暂存的修改 git diff
git diff 本身只显示尚未暂存的改动,即修改后还没有git add的操作
git diff -staged 显示已暂存,但是没有提交的操作
提交更新 git commit / git commit -m “XXX”
提交时记录的是放在暂存区域的快照!!
跳过暂存区,提交所有已跟踪的文件 git commit -a -m 'added new benchmarks'
移除文件 git rm
文件会出现在未暂存区域“Changes not staged for commit”(此时的移除相当于修改操作):
mv project.md
文件会出现在“Changes to be committed”:
git rm project.md
移动文件 git mv
也可以用来重命名
查看提交历史 git log
只显示最近的两次提交记录 git log -p -2
还原项目与撤销操作
- 当文件被别人修改,但是还没有被
git add
时,出现在“changes notstaged for commit”:git checkout -- myproject.md
;如果已经被git add
,可以用git reset HEAD myproject.md
来取消暂存,然后再用上面的命令还原文件 git reset --hard HEAD^
回退到上次commit的版本git commit --amend
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
举个例子:
git log
查看历史版本号
git checkout 版本号
,切换回原版本,不建议修改历史版本
要修改,应该用分支 git checkout -b test
回到原来的主分支 git checkout master
分支合并 git merge test
分支删除git branch -d test
远程仓库
添加远程仓库
- 手动添加远程仓库
git remote add <shortname> <url>
,之后shortname可以替代这个URL - 自动添加远程仓库:如果使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写(否则以"shortname"为简写)。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。如果你的当前分支设置了跟踪远程分支, 那么可以用 git pull 命令来自动抓取后合并该远程分支到当前分支。默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或其它名字的默认分支)。
另外:
添加远程仓库时git remote add 仓库名字 仓库url
不要直接pull,切换一个分支,fetch下来,再merge
分支基本操作:
分支创建git branch test
,但不会切换到新分支,此时HEAD指针指向当前所在的本地分支。
分支切换git checkout test
创建并切换到分支(代替上面两条)git checkout -b test
合并test分支到当前分支git merge test
分支删除git branch -d test
请牢记:当你切换分支的时候,Git 会重置你的工作目录(可以cd进去查看哦),使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。
举个例子:
初始化本地仓库git init
创建并切换到新分支git checkout -b test
在新分支里修改文件vim 1.txt
在新分支里提交修改git commit -a -m "修改1.txt"
切换回master分支git checkout master
将test分支合并到主分支git merge test
删除test分支git branch -d test
再举个例子(分支合并冲突)
- 取消本次合并
git merge --abort
- 解决冲突:
查看冲突情况git status
然后将这些有冲突的文件手动修改,之后再提交即可
主仓库作为服务器
在github上新建一个repository,命名格式为**“linpupu.github.io”**(linpupu为用户名),然后可以再浏览器打开这个网址
本地仓库推送到远程仓库
(若本地没有仓库,则先执行这一步)新建本地仓库:
git init
git add test.md
git commit -m "first commit"
链接远端仓库(此处命名为origin),再向远端仓库push文件:
git remote add origin https://xxxx/xx.git
git push -u origin master
备注:第一次push时应该加上"-u origin master",否则会提示如下:
复制提示的代码git push --set-upstream origin master
或者 git push -u origin master
(-u是–set-upstream的缩写),这里的origin就是前面的远端仓库的别名,master就是本地仓库当前在master分支,下一次推送只需使用git push
。如果提交成功,系统会提示在远程仓库也生成了一个master分支对应当前本地的master分支。另外:
- 如果远端仓库链接是https形式,则需要手动输入账号密码
- 如果远端仓库链接是ssh形式,则直接push就可以成功
需要先生成本地公钥,将他配置到仓库中
还举个例子(远程仓库):
git checkout -b dev
新建并跳转到分支dev
git push -u origin dev
将dev分支推送到远程(需要拥有远程仓库权限)
git checkout -b master
切换回到主分支
git merge dev
将dev分支合并到主分支
git branch -d dev
删除dev分支(被合并的分支记得删除)
在远程仓库新建远程分支:
git push --all
会将本地仓库所有分支全部推送上去- 首先切换到本地仓库的新分支test,然后
git push origin test
裸仓库
关于git 裸仓库的意义
克隆一个裸仓库作为一个远程分支,用来提交代码: git clone --bare repo.git
将别人的.git隐藏仓库复制为裸仓库,无项目仓库,只有裸仓库才可以被推送git push
,这个裸仓库也可以被git clone
后得到项目内容
本地仓库获取远端项目
git pull
git fetch
git merge
关于git fetch与git pull的区别:
https://blog.youkuaiyun.com/weixin_41975655/article/details/82887273
总结:git pull = git fetch + git merge
删除远端分支和迁移仓库
删除远端分支的例子:
拉取最新的远程仓库:git pull
查看远端所有分支:git branch -a 假设此时远端仓库有个test分支,可以新建一个本地test分支,将自动追踪这个远端分支
git checkout test删除本地test分支后,删除远端仓库test分支:
git push origin --delete test`
迁移仓库的例子:
在github新建一个rep,切换本地仓库的远程仓库地址,本地仓库内容不变:git remote set-url origin https://.../xxx.git
再把本地仓库内容push到新仓库:git push -all
SSH连接github
基本格式 ssh git@github.com
创造ssh ssh-keygen
公钥 ~/.ssh/id_rsa
私钥 ~/.ssh/id_rsa.pub
需要将公钥放到服务器(如github gitlab等)的SSH Keys中
步骤图:
请注意:
新生成的ssh密钥可能第一次使用会报错,原因见该博客:https://blog.youkuaiyun.com/Wbiokr/article/details/73431199
gitlab
Git global setup:
git config --global user.name “linpupu”
git config --global user.email “949664458@qq.com”
Create a new repository:
git clone https://gitlab.com/linpupu/test.git
cd test
touch README.md
git add README.md
git commit -m “add README”
git push -u origin master
Push an existing folder:
cd existing_folder
git init
git remote add origin https://gitlab.com/linpupu/test.git
git add .
git commit -m “Initial commit”
git push -u origin master
Push an existing Git repository:
cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/linpupu/test.git
git push -u origin --all
git push -u origin --tags
服务器上的git
- 新加一个用户git
- 使用 chsh -s 命令修改任一系统用户的 shell(例如改为git-shell)
- 用户 git 就只能利用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell。
本节其他的部分,没咋看懂,头秃了QWQ