使用命令ssh-keygen生成,找到.ssh文件夹,即可看到公钥
git branch -r 查看远程分支
git branch [branchName] [commitID] 在某处新建一个分支,命名为branchName
git branch -a查看所有分支,没有-a表示查看本地分支
git checkout -b myBranchName [remoteBranchToBeTracked] 创建新分支,并转到改分支[设置该分支的upStream]
git branch -u remoteBranchToBeTracked [localBranchName] 设置当前分支[或者指定的本地分支]的upStream名
git checkout dev(将head指针checkout到dev) 等价于 git switch dev
git merge dev将dev分支合并到master分支
git merge --no-ff 合并过程会被commit记录
git branch -d 删除分支
git branch -f master(分支名) [commitHash] 将某个分支的指针移动到指定的commit节点
git rebase [targetBranch] 两种情况,当前位于dev分支时候,target Branch为master,结果就是当前分支的所有commit移动到master上面;第二种是移动过后master分支位于dev后面,这是switch到master分支后再使用git rebase dev就可以让两个分支位于同一个位置。
git rebase dev
git cherry-pick [commitId] 挑选分支上的commit节点,commit到当前分支(通常是主分支master)上。注意如果当前指针是在提交树的中间,那么这时候cherry-pick会自动创建新的分支。
git rebase -i startCommit[,endCommit] 从startCommit开始对后面的commit进行合并(减少快照次数,总代码不变),前开后闭的区间,如果没有endCommit会让你选择如何对后面的commit进行合并(--interactive)
git checkout HEAD^ 移动头指针到上一个commit(相对移动) git checkout HEAD^^ 移动头指针到上2个commit(相对移动) git checkout HEAD~3 移动头指针到上3个commit(相对移动) git checkout [commitHash] 绝对移动到某个节点
基本命令 git fetch 从远程仓库获取最新commit并更新本地的远程仓库指针(origin/master)
本地的远程仓库指针(origin/master)与本地仓库有什么区别? origin/master是一个分支名,它的目标是与远程仓库同步。当本地commit的时候,master分支向前走,但是origin/master分支还停留在原处。origin/master当我与远程仓库交互的时候才会变化,例如我执行git pull,git fetch,git push等等。
git pull
git fetch
git push
remote branches reflect the state of the remote repositories since you last talked to those remotes. git fetch is the way you talk to these remotes! origin/master分支通常与远程仓库同步,当执行git fetch后,origin/master与远程同步(多了几个commit),此时本地仓库(HEAD)还未与本地的origin/master同步,执行 git merge后才进行合并。git pull = git fetch; git merge
git merge
git fetch; git merge
git fetch, however, does not change anything about your local state. It will not update your master branch or change anything about how your file system looks right now.So at the end of the day, you can think of running git fetch as a download step.
master
通常,远程有几个分支,本地就有几个对应的远程分支指针,如下图,一个git fetch命令就可以将两个分支和远程进行同步:
git fetch origin remoteBranch : localBranch将某个远程分支fetch到本地分支,并保持本地的origin/remoteBranch不变,如果本地localBranch不存在则创建。如下图:
git fetch origin remoteBranch : localBranch
git pull 等价于git fetch;git merge; git pull --rebase等价于git fetch;git rebase git push [仓库名] [分支名字] 例子: git push origin master 相当于git push; git push origin dev将本地新建的分支推送到远端仓库
git fetch;git merge
git pull --rebase
git fetch;git rebase
git push origin master
git push origin dev
关于git push: 最合适push的场景就是,当前分支与远程分支同名(都是master)然后当前的HEAD又在远程HEAD之后(多了几个commit),这时候push没有一点问题。当不是同一个分支的时候,会在远程创建相应的分支
git push [remoteName localBranch] 将本地的分支推送到远程的分支,例如:git push origin foo git push [remoteName localCommit:RemoteBranchName] 将本地的特定节点(特定节点之前的所有节点)推送到远程某个分支(不存在则创建)例子git push origin master^:foo git remote -v 查看远程库的信息 git remote 查看远程仓库名(默认名称是origin,如果有另一个比如gitee则会有另一个名字) git status 查看那些文件被修改(untracked表示从没有被添加过的文件) git diff 文件名,查看该文件变化
git push origin foo
git push origin master^:foo
git remote add [originName] < address > 例子git remote add origin2(远程库的名字) https://123456/521qq.github.com git push -u [originName] master 例子git push -u origin2 master 将当前master分支和远程master分支关联起来, 以后就可以直接用git push/git pull简写啦
git remote add origin2(远程库的名字) https://123456/521qq.github.com
git push -u origin2 master
git pull与git fetch区别: git pull会自动合并,但有冲突并不会覆盖而是让你进行手动merge。弊端是本地目录会在未经确认下更新,如果使用fetch,可以先git diff [fetch来的分支名]查看下更改,确认后再merge。 不过正常情况直接git pull比较方便而且也没什么问题。
git reset --mixed --hard --soft区别: 作用范围不一样
git reset --mixed --hard --soft
git rebase 与git merge的区别 git merge简单的说就是合并两个分支并生成一个新的提交 工作原理就是:git 会自动根据两个分支的共同祖先即 (3.added merge.txt file)这个 commit 和两个分支的最新提交即 (6.added hello.txt file) 和 (5.added test.txt file) 进行一个三方合并,然后将合并中修改的内容生成一个新的 commit,即图二的(7.Merge branch ‘develop’)。 git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提交的commit删除.
git rebase
工作原理: 在执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面,如下两图所示,图四为初始状态,图五为执行rebase后的状态。
还有一点说明的是,在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull --rebase,相当于git fetch + git rebase
2.恢复 git log查看commit提交历史记录 或 git reflog查看命令历史
如果没有push过,那就可以用reset命令回退,如果已经push到远程仓库,那么就一定要使用revert命令(相当于commit到了之前),然后再次push到远端,就可以回退到之前的状态
git reset [commitId | HEAD^] 返回到某个状态(本地仓库使用,如果是远程仓库返回,则应用到revert命令) git revert [commitId | HEAD] ⚠️注意使用revert命令与reset的不同:reset是返回到某个节点,后面的节点丢弃;revert是提交一个新的节点,这个节点的内容是[commitId | HEAD] 提交之前的所有内容。换句话说,reset后面跟的commit ID是你想要恢复到的节点,而revert后面的commit ID是你想要舍弃的节点,该节点之前的节点才是你想要恢复到的节点。 git checkout --filename 曾经添加到版本库的文件可以恢复
强制命令: git push -f 强制覆盖。但是这是一个非常非常危险的操作,如果你 git push -f 了,没有人会知道你到底修改了什么,只建议在自己独有的分支上如此操作,一定一定要谨慎使用
修改上上次的commit内容
git rebase HEAD^^ # 调换上次与上上次的commit顺序 git commit --amend # 对上上次的commit后内容进行修改 git rebase HEAD^^ # 调换上上次与上次的commit顺序 git rebase caption master #