git常用命令总结(面试和日常工作)

git常用命令总结(面试和日常工作)

520发表于2019-08-20

一、创建仓库

1、把当前目录变成Git可以管理的仓库:

$ git init

二、提交代码相关

1、把当工作区文件加到暂存区
单个文件加入
git add x.java
全部文件加入

git add .


2、把暂存区的内容提交到本地仓库
git commit -m "xxx"

3、克隆一下远程仓库到本地
git clone git@github.com:michaelliao/gitskills.git
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

要查看远程库的信息,用git remote:

$ git remote
origin
或者,用git remote -v显示更详细的信息:

$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。


4、添加一个远程仓库

git remote add origin git@github.com:michaelliao/learngit.git



5、本地库的所有内容推送到远程库上。

git push -u origin master



6、提交日志查看(详细)

git log


7、提交查看(简洁版)

git log --pretty=oneline


8、把本地的dev推送到远程的origin

git push origin dev


9、指定本地dev分支与远程origin/dev分支的链接

git branch --set-upstream-to=origin/dev dev

三、版本回退

1、回到上一个版本
git reset --hard HEAD^

3、回到上倒数第3个版本
git reset --hard HEAD^^^

4、回到上100个版本
git reset --hard HEAD~100

5、回到指定版本
git reset --hard 1094a

在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到最后一个版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

四、撤销更改

丢弃修改,这个文件回到最近一次git commit或git add时的状态。类似svn revert命令。
git checkout -- readme.txt

五、bug分支功能

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。

1、把当前工作区的内容保存并隐藏起来,等bug分支修改后并合并后可以重新回到之前的工作。

保留现场

git stash

2、创建一个bug修复的分支

git checkout -b issue-101

3、推送本地分支到远程仓库

git push --set-upstream origin 本地分支名

4、从远程仓库里拉取一条本地不存在的分支

git checkout -b 本地分支名 origin/远程分支名
如果出现提示:
fatal: Cannot update paths and switch to branch 'dev2' at the same time.
Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
表示拉取不成功。我们需要先执行
git fetch
然后再执行
git checkout -b 本地分支名 origin/远程分支名

5、删除本地分支 

git branch -d 本地分支名

6、删除远程分支 

git push origin --delete 分支名
git branch -r -d origin/branchName
git push origin :branchName

7、切换到master分支

git checkout master

8、把issue-101分支合并到当前分支

git merge --no-ff -m "merged bug fix 101" issue-101

注意:

--no-ff指的是强行关闭fast-forward方式。

fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit

git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

总结:
--no-ff:不使用fast-forward方式合并,保留分支的commit历史
--squash:使用squash方式合并,把多次分支commit历史压缩为一次

from clipboard


from clipboard



9、查看是否有保留的工作现场

git stash list


10、回到上一次保留现场=》删除保留的现场记录
git stash apply=》git stash drop


11、直接回到回到上一次保留现场并删除记录
git stash pop


12、使用Git下载指定分支

git clone -b 分支名 仓库地址
如:
git clone -b v2.8.1 https://git.oschina.net/oschina/android-app.git

解释一下这个命令:-b表示要从分支下载,v2.8.1就是具体的某个分支的名称,https://git.oschina.net/oschina/android-app.git这是app源码的git仓库地址

六、Feature分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

现在,你终于接到了一个新任务:开发代号为Vulcan的新功能,该功能计划用于下一代星际飞船。

1、创建一个feature分支
git checkout -b feature-vulcan


2、删除一个feature分支
git branch -d feature-vulcan
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。。

七、分支通用经验

1、master分支是主分支,因此要时刻与远程同步;

2、dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

3、bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

4、feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

八、自定义git

1、git忽略文件:
编写.gitignore文件,如:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

2、配置别名(命令简写配置)
如果敲git st就表示git status那就简单多了。
git config --global alias.st status
还可以:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'


git完整教程请看:https://www.liaoxuefeng.com/wiki/896043488029600,这里只是摘录了核心知识点。


小编蓝狐