git 常用命令行

git status 查看当前状态

git log 查看提交日志

git log --pretty=oneline    查看提交日志(只列出commit id、   commit msg 和 分支信息,比较直观)


分支操作

git branch 查看本地分支

git branch -r 查看远程分支

git branch -a 查看所有分支(本地+远程)

git branch branchname 创建分支(本地)

git checkout branchname 切换分支(本地)

git checkout -b branchname 创建并切换分支(本地)

git branch -d branchname 删除本地分支(注意,如果当前在该分支,必须先切到其他分支,再删除该分支

git branch -D branchname 强制删除本地分支(适用于用 git branch -d 删除报:the branch  XXX is not fully merged(分支有未合并的更改) 时,想强制删除分支的情况

提交操作

git add <file>...

git add .    将所有修改添加到暂存区

git commit -m"commit msg"

git commit -am"commit msg"


场景:

1. 执行 git add . 这个操作后,后悔了,想回到这个操作之前的状态(之前做出的更改仍保留),比如:


想回到之前的状态,其实命令行已经给出提示了(见上图的红色框):


即:git reset HEAD file

2. 本地做了更改(未commit到本地仓库),但某个文件中的更改不想要了,要回退到之前未修改时的状态(即不保留修改)


如上图所示,git checkout -- file 可撤销文件的修改


3. 本地做了更改(已经commit 到本地仓库),但突然不想要这些更改了,要回退到之前未修改时的状态(即不保留修改)

先git log 找到此次提交之前的那个提交的commit id(xxxxxx) ,然后执行 git reset --hard xxxxxx


4. 远程新建了一个分支,但在终端查看远程分支却看不到:

远程新建分支后,需要在终端先执行  git pull 才能看到远程新建的分支


5. 本地新建一个分支,但远程并没有这个分支,执行git push会报“fatal: The current branch XXX has no upstream branch.”

本地分支需要和远程分支建立关联后,才能直接使用git push提交,解决方式:

git push --set-upstream origin branchname

注意: 由于执行该命令前,远程并没有branchname这个分支,所以这种方式会在远程新建branchname分支。


6. 拉取远程的某个分支,并在地新建一个分支与该远程分支关联(本地分支名可以和远程分支名不一样)

我们在本地新建分支要和远程分支关联,一般不会直接在本地建完分支再跟远程分支关联,因为那样之后关联起来会比较麻烦,所以,正确的逻辑是:拉取远程分支的同时,创建本地分支。

有两种方式:

(1)git checkout -b localBranchXXX origin/remoteBranchXXX

使用该方式会在本地新建分支localBranchXXX,并自动切换到该本地分支。另外,localBranchXXX和remoteBranchXXX不一定要名称相同。

(2)git fetch origin remoteBranchXXX:localBranchXXX

使用该方式会在本地新建分支localBranchXXX,但是不会自动切换到该本地分支,需要手动checkout

7. 像第6条中那样,拉取远程分支并新建了一个本地分支与之关联,本地分支想要同步远程分支的内容

直接执行git pull

8. 像第6条中那样,拉取远程分支并新建了一个本地分支与之关联,本地分支想要将本地修改同步到远程分支

(1)本地分支和远程分支名称相同:git push origin HEAD   或者 git push origin CURRENT_BRANCH_NAME

关于HEAD: A handy way to push the current branch to the same name on the remote. HEAD points to the top of the current branch. git can obtain the branch name from that. So it's the same as: 

git push origin CURRENT_BRANCH_NAME

but you don't have to remember/type the current branch name. Also it prevents you from pushing to the wrong remote branch by accident.

(2)本地分支和远程分支名称不同


由上图可以看出,当远程分支名称跟本地分支名称不同时,要使用: git push origin HEAD:remoteBranchName


9. 本地做出了修改,先git add . 或git add file... ,然后git commit -m"commit a change ", 这时突然想撤销这个commit(这个时还没有执行push ),同时保持本地的修改


上图的步骤是这样的: 先git log 找出此次提交之前上一个提交的commit id (xxxxxx),然后 git reset xxxxxx


10. 本地做出了修改,先git add . 或git add file... ,然后git commit -m"change 1 ",这时没有将此更改push到远程。接着又在本地继续修改,然后git add . 或git add file... ,但此时想把这两个更改合并成一个(即共用一个commit id),其实严格来说叫追加到第一个commit中

首先,要说明的是,即使不合成而是对第二次更改也git commit -m"change 2",然后再push到远程,也是没有问题的,只不过是两次更改有着两个不同的commit id 而已。

git commit --amend

执行上面的命令后,可以对commit msg 进行修改,然后ESC + Shift + :输入wq 保存即可,随后再push


11. 本地做出了N次修改,然后分N次commit到本地仓库(均未push),然后想要将这N次更改合并到一个commit(即共用一个commit id


如上图所示,先执行git log 找到N次提交前的那个commit id (xxxxxxxxxx), 然后执行 git rebase -i xxxxxxxxxx 进入如下界面:



上图 ESC + shift + : wq 保存后进入如下界面:


上图 ESC + shift + :  wq 保存后结果如下图所示:


至此,多个提交已合并到一个commit id ,可以进行push了,push后的结果:



12. git log 查询出有若干次提交,commit id 由近到远为(id4 , id3, id2, id1) ,然后使用git reset --hard <id2> 将版本回退到commit id 为id2的版本,这时突然后悔了,想要再回到id3或者id4的版本

有两种情况:

(1)id3或id4的更改已经push到远程

这种情况下,即使终端被关闭了,也是可以从远程仓库查到id3、id4的commit id, 然后直接执行git reset --hard <id3/id4>即可。

(2)id3或id4的更改未push到远程

这种情况下,如果你在之前执行过git log的话(且终端没有被关闭),终端会有id3、id4的commit id记录,找到后执行git reset --hard <id3/id4>即可。但如果之前没有执行git log ,那么由于执行了git reset --hard <id2>,id3和id4的commit id 就无法通过git log 查到了,那么应该怎么办呢? git 提供了一个git reflog可以查询之前的执行过的命令。



猜你喜欢

转载自blog.csdn.net/huxinguang_ios/article/details/80450601