git相关笔记
文章目录
初始配置
git config --global user.name "Your Name"
,git config --global user.email "email@example.com"
用来配置用户名和邮箱,一般在第一次操作时会提醒配置。ssh-keygen -t rsa -C "youremail@example.com"
执行后默认会在C:\Users\Administrator\.ssh
下生成几个文件,只要将其中的id_rsa.pub
中的内容复制
到(gitlab,github)对应配置ssh的地方保存后就可对有权限的仓库进行代码的push操作。- 在用ssh类型的地址(例如:
git@114.55.92.162:chendebo/gitNote.git
)项目时,ssh密钥起作用则在push,pull等操作时就不要再次输入密码。 - 在使用http类型的地址(例如:
http://114.55.92.162/chendebo/gitNote.git
)项目时,ssh密钥则无效,为了避免重复输入账号密码:
方法一:git config --global credential.helper store
方法二:clone时添加前缀http://yourname:password@114.55.92.162/chendebo/gitNote.git
- 如果你正在使用ssh想转换成http:
git remote rm origin
,git remote add origin http://yourname:password@114.55.92.162/chendebo/gitNote.git
创建仓库
先本地后远程
git init
将当前文件夹初始化为git本地仓库git remote add origin git@server-name:path/repo-name.git
要关联一个远程库(git remote
要查看远程库的信息,或者,用git remote -v
显示更详细的信息)git push -u origin master
第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push
推送最新修改;
先远程后本地
git clone git@server-name:path/repo-name.git
将远程仓库克隆到本地
代码的提交
git add file
将工作区的代码提交到暂存区,在项目多文件提交是可以使用git add .
,git add src/.
其中(.)表示文件夹下的所有文件。git commit -m '注释'
将暂存区中的代码提交到本地仓库。git push
将本地仓库的代码修改提交到远程仓库,可以指定提交的仓库,默认为origin
查看历史和状态
git status
命令可以让我们时刻掌握仓库当前的状态,但是看不出修改了什么git diff
用来查看修改的细节git diff HEAD filename
查看工作区和版本库里面最新版本的区别git log
命令显示从最近到最远的提交日志,--pretty=oneline
参数可简化内容,--graph
可以看到分支合并图,--abbrev-commit
筛选出提交git reflog
用来记录你的每一次命令,当你用git reset --hard HEAD^
回退到当前版本之前的版本时,再想恢复到当前版本,就必须找到对应commit id
关于git reset
- git reset的版本回退针对的是本地的查看,未push的。(否则回退后提交会冲突)
--soft
:工作区会保留修改后的代码,只是将git commit信息回退到了某个版本--mixed
:工作区会保留修改后的代码,只是将git commit和index 信息回退到了某个版本(默认)--hard
:源码也会回退到某个版本,commit和index 都回回退到某个版本git reset --hard id
回退版本,其中id为commit id(通过查找历史课查看),也可以用HEAD(其实为指针)表示当前版本,
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区
- 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
- 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
关于git revert
- git revert用一个新提交来消除一个历史提交所做的任何修改.
- revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)
git revert c011eb3
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
关于git checkout
git checkout filename
把filename文件在工作区的修改全部撤销,情况一:自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
情况二:已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit
或git add
时的状态git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
关于git stash
git stash
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作git stash apply
恢复,但是恢复后,stash内容并不删除git stash drop
来删除stash内容;git stash pop
恢复的同时把stash内容也删了git stash list
查看,然后恢复指定的stash,用命令: git stash apply stash@{0}
分支操作
git branch
查看分支git branch <name>
创建分支git checkout <name>
切换分支git checkout -b <name>
创建+切换分支git merge <name>
合并某分支到当前分支git branch -d <name>
删除分支
关于标签
git tag
查看所有标签git show <tagname>
查看标签信息创建带有说明的标签,用-a指定标签名,-m指定说明文字:git tag -a v0.1 -m "version 0.1 released" 3628164
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签git push origin <tagname>
可以推送一个本地标签;git push origin --tags
可以推送全部未推送过的本地标签;git tag -d <tagname>
可以删除一个本地标签;git push origin :refs/tags/<tagname>
可以删除一个远程标签
常见问题及解决方法
- A从B那fork了一个项目,之后A对派生过来项目进行了修改,B对自己的项目也进行了修改,一段时间后A想合并B的最新代码怎么办?
fork后的项目一般会clone到本地进行修改,在克隆的过程中确实就已经将你本地仓库可你fork后的项目进行了管理
也就是执行了git remote add origin git@server-name:path/repo-name.git
(通过git remote
可以查看你本地仓库关联的远程仓库)
此时只要执行git remote add oor git@server-name:path/repo-name.git
关联B的原始项目仓库,再执行git pull oor
将B修改过后
的代码更新到本地,然后在origin master分支上执行git merge oor/master
就可以合并B修改后的代码了(主要在合并操作请需要将本地修改的代码add,commit)
最后解决冲突提交即可。
- 在git pull时出现
ssh: connect to host 114.55.92.162 port 22: Connection timed out fatal: Could not read from remote repository....
vi /etc/ssh/sshd_config
编辑配置文件,将port 22和protocol 2的注释去掉可以解决问题。
- 在git pull时提示
no tracking information
说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name remote-name/branch-name
例如git branch --set-upstream dev origin/dev