Skip to content

Git使用笔记(不定期更新)

gitclone

首先需要在Ubuntu上安装git客户端,使用命令:

sudo apt-get install git

然后去github上注册一个账户

下来需要生成本地ssh-key,使用命令

ssh-keygen -t rsa -C "xxx@xxx.com"

把xxx换成你自己的邮箱,生成key后会提示你输入保存文件名(例如‘key’),可以留空,之后是密码,也留空,默认会在~/路径下生成.ssh文件夹,里面有id_rsa.pub就是生成的公钥,如果你填了文件名(刚才的‘key’),会在当前路径下生成 key.pub 和 key 两个文件,其中 key.pub 是公钥,key 是私钥。
使用任意文本编辑器打开 key.pub

gedit key.pub

然后复制里面的内容。

打开github主页,在你的账户Account settings里选择SSH Keys, 点一下右边的 Add SSH key,title随便填,Key里粘贴刚才复制的内容,保存,然后在终端使用如下命令进行测试。

ssh -T git@github

如果你看到Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.说明设置成功。

之后我们开始下代码:
在你想下载代码的github主页右下角找到 HTTPS clone URL,如下图,点击下面的SSH切换到SSH地址。
gitclone

gitclone2

git config


先来设置一下git的相关信息:

git config --global user.name "your name"
git config --global user.email "xxx@xx.com"

把”your name”和”xxx@xxx.com”换成你自己的名字和邮箱,每次提交的时候会用到。
git config有两种level,一种只对当前repo有效,不带--global,另一种全局生效

git config alias.xx checkout

git clone


复制地址,在终端里输入:

git clone [url] [targetfolder]

之后你就能拿到代码了。

git pull


git pull

能够把远程服务器上的变更同步到本地库里,如果有冲突需要merge

git status & git add


在git commit之前,你可以使用

git status

察看当前改动情况,把你需要commit的改动使用

git add filename 添加一个改动(stage)
git add -A 添加所有改动(stage)

撤销错误的add,此时还没有运行commit(unstage)

git reset [files_to_remove_from_add]

添加到要提交的列表里,然后使用

git commit -m 'Comments'

commit到本地代码库上。
git add -A 和 git commit -m ” 可以合并成一条语句

git commit -am '[comment]'

检查无误后,使用

git push

提交到github上就ok了。

git checkout


切换branch

git checkout [branchname]

创建一个新的branch并checkout新建的branch

git checkout -b [branchname]

以一个branch为基础创建另一个branch

git checkout -b [targetBranch] [sourceBranch]

最后push新创建的branch

git push -u origin [targetBranch]

git branch

查看当前本地分支

删除本地分支

git branch -D [branchname]

git merge

把别的branch上(一般是master)上的变更merge到当前branch。

git merge [branchname]

例如

git merge master

这里有一点需要注意的,就是merge的是本地branch上的变更,例如你要merge master到当前branch,要确保master是最新的。最好先切换到master上pull一下,然后再进行merge,总结起来就是

git checkout master
git pull
git checkout [yourbranch]
git merge master

把branch上某个改动的文件恢复到未改动版本(即undo)

git checkout [filepath]

git reset


重置git add的状态到未add之前,

git reset

强制放弃本地改动,比如在merge别的branch的时候不想merge了

git reset --hard

如果已经有本地的commit了,并且commit了多次,突然不想要本地的commit了,想把本地代码恢复到未更改的状态,
首先需要查看一共有几个commit,
通过,

git status

可以看到本地比远端版本超出了几个commit,假如1个,那么用下面的命令

git reset --hard HEAD^

如果commit超过1,那么用下面的命令

git reset --hard [commitnumber]

放弃本地commit

git reset --hard origin/[branch_name]

git cherry-pick


选择拿某一次改动到当前branch

git cherry-pick [commithash]

git blame


神技-查看文件每一行是由谁在哪次commit中修改的, 按q退出

git blame [filename]

git show


神技-查看其它branch中的文件

git show [branchname]:[filename]

天外飞仙神技-导出其它branch中的文件不切换branch

#此命令会把[branchname]上的[filename]文件保存为当前路径下的[newfilename]
git show [branchname]:[filename] > [newfilename]

git log [path]


不传 [path] 参数会查看整个 repo 的提交历史,传 [path] 参数用于查看某个文件的提交历史
天外飞仙神技-查看已经被重命名的文件历史

git log --follow -p [path]

这样就能看到文件被更改前的历史啦,然后配合 git show 命令查看过去具体版本的改动啦

同步 fork

git remote add upstream git@源repo地址.git
git remote -v
git fetch upstream
git checkout master
git merge upstream/master

git stash


天外飞仙神技-在有改动的情况下(uncommitted changes) 切换branch,并把改动应用到新的branch上

git stash #此命令把当前branch上的改动(uncommitted changes)保存到stash缓存区,并恢复代码到未改动状态
git checkout [branchname] #切换到别的branch
git stash pop #取出stash缓存区里最顶端的改动,应用到当前branch

git stash相关命令

git stash list #列出当前所有的stash缓存区的改动
git stash clear #清空stash缓存区
git show stash@{0} #查看stash缓存区顶部的改动 
git stash apply stash@{1} #将指定版本号为stash@{1}的改动应用到当前branch
git stash save "work in progress for foo feature" #为当前未提交改动加一个注释,并保存到stash缓存区
git stash apply stash^{/<regex>} 按正则表达式应用stash

下面的配置使得每次rungit pull的时候会自动rebase,等同于git pull --rebase的效果

git config pull.rebase true

下面的配置使得每次pull的时候会自动stash当前本地的改动,不用手动stash,并在pull之后stash pop本地change

git config rebase.autoStash true

在 rebase 时如果能够确定 rebase 冲突统统以自己的 change 或者他人的为准,可以用下面的命令

git rebase -X theirs[或者 ours] branchName

再提一个.gitignore文件,这个是git检测改动时会忽略文件的列表,把你不需要git检测的文件都添加进去,例如打build生成的obj,bin等文件夹,统统添加进去。你可以自己手动新建一个,放到代码跟目录下就可以了。

让git bash命令行显示时间戳
打开git安装目录下Git\etc\profile或者Git\etc\profile.d\git-prompt.sh搜索像下面这样的代码:

PS1="$PS1"'\n'                 # new line
PS1="$PS1"'\[\033[32m\]'       # change color
PS1="$PS1"'\u@\h '             # user@host
PS1="$PS1"'\[\033[33m\]'       # change color
PS1="$PS1"'\w'                 # current working directory
if test -z "$WINELOADERNOEXEC"
then
    PS1="$PS1"'$(__git_ps1)'   # bash function
fi
PS1="$PS1"'\[\033[0m\]'        # change color
PS1="$PS1"'\n'                 # new line
PS1="$PS1"'$ '                 # prompt: always $

加一行

PS1="$PS1"' \t'                # time

Screen Shot 2017 12 05 at 15.36.04

删除branch

删除本地branch

git branch -d [local_branch]

删除远程branch

git push origin --delete [remote_branch]

天外飞仙神技-删除本地所有除了 master 以外的 branch

git branch -d $(git branch --merged=master | grep -v master)   #删除所有已经 merge 到 master 的本地 branch,除了 master
git fetch --prune #删除所有本地的已经被远端删除的分支

根据 tag 创建 branch

有时候我们会根据某个特定的 tag 创建 branch,这时候需要运行如下命令:

git branch [branchName] [tageName]

模糊匹配 diff

可以使用通配符 * 进行模糊匹配,这样就不用敲完整代码啦,

git diff -- *xxx*

比如有个文件是

/home/desktop/aaaa/cccb/casdf/cda/hhh.cs

用 git diff 的时候可以

git diff -- *hhh*

就可以 diff 啦

参考链接:
【Github教程】史上最全github使用方法:github入门到精通
Git 教程 – Git 基本用法
日常使用 Git 的 19 个建议
Git Cheat Sheet
git stash和git stash pop

0 0 votes
Article Rating
Tags:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
1
0
Would love your thoughts, please comment.x
()
x