本文介绍的是把本地新建的项目上传到github上,以便之后能随时、随地拉取项目开发。
1.安装git
2.安装完成后,启动git bash,执行git命令
git config --global user.name "Your Name" git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置。
3.在项目根目录下执行git init命令
git init
执行完之后,就会在项目根目录中生成一个.git隐藏目录。
4.去github创建自己的repository。
5.将本地仓库与github新建的远程仓库相关联
如果github新建仓库地址是https://github.com/koushr/sparkDemo.git,则命令为
git remote add origin https://github.com/koushr/sparkDemo.git
如果报错的的话,则先执行remove命令,再执行add命令
git remote rm origin
6.将项目的所有文件添加到仓库中
git add .
注意,add和点之间有空格
7.上传github之前,要先pull一下,执行如下命令
git pull --rebase origin master
8.将add的文件commit到仓库
git commit -m "注释语句"
注意,这里注释语句必须有,不能省略,否则会报错,随便写点什么就好,如first push。
9.上传代码到github远程仓库
git push -u origin master
至此,在github上浏览此仓库,就可以看到上传的代码了。
之后,如果是在当前电脑开发,则开发完成后直接可以用idea上传代码。如果是在其他电脑开发,则可先通过git来checkout代码,然后在开发完成后上传代码即可。
常用命令:
git clone:
从远程主机克隆一个版本库:git clone <版本库地址> <本地目录名>。如git clone https://github.com/jquery/jquery.git。这将在本机生成一个jquery目录,因为远程主机的版本库名称是jquery。如果我们想指定不同的目录名,则可以git clone https://github.com/jquery/jquery.git myJquery。git clone不仅支持HTTP(s)协议,还支持SSH、Git协议。
git remote:
为了便于管理,git要求每个远程主机都有一个主机名。git remote用于管理主机名。git remote 可列出所有远程主机。git remote -v 可以查看所有远程主机及其地址。git clone版本库时,远程主机默认命名为origin。如果想用其他主机名,则在git clone可以用-o选项指定,如git clone -o jquery https://github.com/jquery/jquery.git。
git remote show <主机名>,可以查看该主机的详细信息。如git remote show origin
git remote add <主机名> <地址>,用于添加远程主机。
git remote rm <主机名>,用于删除远程主机。
git remote rename <原主机名> <新主机名>,用于重命名远程主机。
git remote prune origin:清除远程分支缓存。有时我们在A端删除了某个远程分支,但是在B端还能看到这个远程分支,删除这个远程分支时失败,此时执行这个命令后,在所有的地方都看不到这个远程分支了。
git branch:
查看所有本地分支:git branch。查看所有远程分支:git branch -r。查看所有本地分支和远程分支:git branch -a,远程分支以remotes/origin/XXX显示。
重命名本地分支xx:git branch -m old_branchName new_branchName,或者在要改名的分支上git branch -m new_branchName
删除本地分支xxx:git branch -D xxx
切断当前本地分支与远程分支的跟踪关系:git branch --unset-upstream
git checkout:
git checkout A:切换为本地A分支,如果本地没有A分支,则会建一个follow远程A分支的本地A分支,如果远程没有A分支,则会报错。
git checkout -b A:在当前本地分支的基础上,新建一个本地分支A。
在远程master分支的基础上新建一个xxx分支:git checkout -b xxx origin/master。注意此时xxx分支其实是follow远程master的。我们可以通过git branch -vv命令来查看本地各分支follow的远程分支。这个时候应该先把本地xxx分支推送到远程xxx分支上,git push -u origin xxx,会自动创建远程xxx分支,并且把本地xxx分支和远程xxx分支关联上。如果我们远程分支名不想叫xxx,而是想叫yyy,则可以git push -u origin xxx:yyy,这样远程就会新建一个yyy分支。同样可以用git branch -vv验证。git push -u origin local_branch_name:remote_branch_name可以执行任意多次,假如remote_branch_name每次都不一样,则每次都会新建一个远程分支,并与本地分支关联。
git fetch:
获取远程分支的更新。git fetch <远程主机名> <分支名>
远程分支有新增的话,必须先执行本命令,才能在本机checkout,否则会报 'origin/xxx' is not a commit and a branch 'xxx' cannot be created from it 错误。
当想获取所有分支的更新时,分支名可以省略。远程主机名和分支名都省略时,表示获取所有远程主机的所有分支的更新。
如获取origin远程主机aaa分支的更新:git fetch origin aaa。注意这里origin不能省略,不然会把aaa当成远程主机名,就会报错。
获取origin远程主机所有分支的更新:git fetch origin
git pull
获取远程分支的更新,并merge进本地分支。git pull <远程主机名> <远程分支名>:<本地分支名>
如获取origin远程主机master分支的更新,merge进本地aaa分支:git pull origin master:aaa。如果是把远程分支merge进当前分支,则冒号及之后可以省略。如远程master分支merge进当前分支:git pull origin master。
git push
git push <远程主机名> <本地分支名>:<远程分支名>
第一次push时,要用上面的git push -u。
把本地abc分支推送到远程xxx分支:git push origin abc:xxx
删除远程分支xxx:git push -d origin xxx
git reset
git reset --hard 还原本地所有更改
git reset --hard commitid 还原到指定commitId。注意,是还原到,所以想还原到哪里,就提供那个commitId。假如提供的commitId是前天提交的,那么这两天的提交记录都会消失。
git revert用于回退远程分支,一般加上-n选项。-n等同于--no-commit,如果不加-n选项,那么回滚几个commitId,就要写几次commit,加了-n,只需在最后一次commit and push即可。
git revert HEAD 撤销最新一次commit
git revert HEAD~1 撤销倒数第二次commit
git revert HEAD~2 撤销倒数第三次commit
git revert commitId 撤销指定的commit
git revert还支持指定范围的撤销,git revert -n fromCommitId..endCommitId。左开右闭,会回滚endCommitId,但不会回滚fromCommitId。如果endCommitId是最新的commitId,那么就会回滚到fromCommitId上。和git reset不同,git revert会保留中间的提交记录。
把分支回滚到之前某一个版本:
A->B->C->D,A是好的,B、C、D是有问题的,想回滚到A。ABCD都是commitId。
第一种方法:用git reset
git reset --hard A
git push -f
必须要有-f参数,否则会报错,提示Updates were rejected because the tip of your current branch is behind。
有些公司会设置禁止这种情况下的强制push,此时,这个方法就失效了,只能用git revert。
第二种方法:用git revert
git revert -n A..D
commit and push
或者git revert B^..D。^代表前一次的commitId,^^代表前两次的commitId,依次类推
git merge
git merge --squash other_branch_name,之后再commit and push。这样子merge,push后只会有一条commit记录,不会有other_branch_name的一大堆commit记录。
git log:展示所有的commit记录,可以看出commitId、commit注释、commit人和commit时间。
git log --pretty=oneline:展示所有的commit记录,每条记录占一行,只能看出commitId和commit注释。
查看最新的commmitID:
git log --pretty=oneline | awk '{print $1}' | sed -n '1p'
或者
git rev-parse HEAD
查看远程分支是谁建的、最后一次提交是什么时候:
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n
为啥提示"输入文件指定了两次"???
如果只想看某个远程分支,则可以在最后面加上grep
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | grep branchName
git clean
git clean -df:删除没有git add的文件
如果只是想dry run,即看看会删除哪些文件,则可执行git clean -ndf