Git提交代码-基本说明

144 阅读5分钟

基础说明

1、检出仓库 执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/repository 如果是远端服务器上的仓库,你的命令会是这个样子: git clone username@host:/path/to/repository

2、工作流 你的本地仓库由 git 维护的三棵“树”组成。 第一个是你的 工作目录,它持有实际文件; 第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动; 第三个是 HEAD,指向你最近一次提交后的结果。

3、添加与提交 你可以计划改动(把它们添加到缓存区),使用如下命令:

添加: git add git add * 这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:

提交: 将文件添加到本地仓库区:git commit -m "说明信息" 单独提交某个文件至仓库区:git commit test1.txt -m "说明信息"

提交所有改动的文件:git commit -am "说明信息"

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

4、拉取最新的分支 git pull origin master

git rebase master ( 注意:pull代码之后,一定要rebase:把master上别人新加的东西,加到local分支上,这样local分支和服务器保持同步。 如果不rebase,只是pull的话,local分支上的代码不能保证是最新的)

git status 查看提交的状态


5、推送改动 你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库: git push origin master 可以把 master 换成你想要推送的任何分支。 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加: git remote add origin 如此你就能够将你的改动推送到所添加的服务器上去了。

git push origin develop-m:refs/for/develop-m

git submit develop-m

6、分支 分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。 创建一个叫做“feature_x”的分支,并切换过去: git checkout -b feature_x 切换回主分支: git checkout master 再把新建的分支删掉: git branch -d feature_x 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的: git push origin 或 git push -u origin

7、更新与合并 要更新你的本地仓库至最新改动,执行: gitpull以在你的工作目录中获取(fetch)并合并(merge)远端的改动。要合并其他分支到你的当前分支(例如master),执行:git pull 以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。 要合并其他分支到你的当前分支(例如 master),执行: git merge

$ git merge --no--ff 【git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态;;;git merge 不会保存】 两种情况下,git 都会尝试去自动合并改动。不幸的是,自动合并并非次次都能成功,并可能导致 冲突(conflicts)。 这时候就需要你修改这些文件来人肉合并这些 冲突(conflicts) 了。改完之后,你需要执行如下命令以将它们标记为合并成功: git add 在合并改动之前,也可以使用如下命令查看: git diff <source_branch> <target_branch>

8、标签 在软件发布时创建标签,是被推荐的。这是个旧有概念,在 SVN 中也有。可以执行如下命令以创建一个叫做 1.0.0 的标签: git tag 1.0.0 1b2e1d63ff 1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用如下命令获取提交 ID: git log 你也可以用该提交 ID 的少一些的前几位,只要它是唯一的。

9、替换本地改动 假如你做错事(自然,这是不可能的),你可以使用如下命令替换掉本地改动: git checkout -- 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。

假如你想要丢弃你所有的本地改动与提交,可以到服务器上获取最新的版本并将你本地主分支指向到它: git fetch origin git reset --hard origin/master

10、有用的贴士 内建的图形化 git: gitk 彩色的 git 输出: git config color.ui true 显示历史记录时,只显示一行注释信息: git config format.pretty oneline 交互地添加文件至缓存区: git add -i

==================================== 11、会退到merge

报:error: you need to resolve your current index first

$ git reset --merge

Idf74339fc1672b1c4356ef7f494ba30a2b858d06

==================================== 12、获取 pull 远程分支的代码 git pull 命令用于从远程获取代码并合并本地的版本。

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。 git pull origin master:brantest

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。 git pull origin master

$ git remote -v # 查看信息

13、删除分支 $ git branch -d develop_v_2021_02_25

==================================== 14、版本回退(HEAD最新的版本)

回退两个个版本【回退之后的内容发生改变】 git reset --hard HEAD^2 回退两个个版本【回退之后的内容不发生改变】 git reset --soft HEAD^2

回退到指定版本【哈希值】此方法不推荐使用,会丢失硬代码 git reset --hard b253ceffcfc5751a09d2acf33b3c56d347f56b88 【指针和数据都会被覆盖】

推荐使用,只是改变指针的head的commitId git reset --soft 634edd5fe8d166d65735feace94eb0b7e06e054a 【仅改变指向快照的指针指向】

==================================== 15、push问题

git push origin 分支名:refs/for/分支名

git submit 分支名

==================================== 16、pull问题 不要用git pull,用git fetch和git merge 代替它。 git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。 当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。看起来git pull的用法会使你吃惊,简单看一下git的使用文档应该就能说服你。 将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。 当然,除非你关闭所有的安全选项,否则git pull在你本地工作目录还不至于造成不可挽回的损失,但很多时候我们宁愿做的慢一些,也不愿意返工重来。

pull = fetch(更新最新的commitId---[哈希值]) + merge(合并分支的代码) 执行fetch后,本地库当前master分支的指针指向并没有变,所以工作区的内容也不会变,但是关联远程库的master分支的指针却变成了最新的commitid。 (fetch操作已经把修改内容下载下来)然后再执行merge操作(git merge origin/master),就是将远程库的master分支合并到当前分支即master。

$:git fetch 这将更新git remote 中所有的远程repo 所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中 ##git fetch remote_repo 这将更新名称为remote_repo 的远程repo上的所有branch的最新commit-id,将其记录。 ##git fetch remote_repo remote_branch_name 这将这将更新名称为remote_repo 的远程repo上的分支: remote_branch_name

##git merge # 将branch分支合并到当前分支 $:git merge origin/master #将远程分支合并到当前分支

一般情况 所在分支代码 pull :gitfetch:git fetch :git merge origin/master $:git commit –-amend 所在分支代码 pull

====================================== 17、commit重写和置换commitId和msg信息 git commit --amend --no-edit 不可编辑【修改commitId msg不变】

git commit --amend -m "xxxx"

git commit –-amend 可编辑

git reset --soft I1638bf7c518cbf67d91fb3b04ab0d42917800120 #回退到指定的HEAD

git reset --soft HEAD~3 #回退到指定的HEAD

====================================== 18、问题解决

HEAD -> refs/for/develop-m (commit 7793a50: Change-Id must be in message footer)

a、git log 找到对应的commitId

b、git reset --soft c2f0bec92258d446be2a7d1a0a2cc901ff415717 回退到指定的HEAD

c、git commit –-amend 【添加一下的内容】

Desc: MERGECODE

Type: ReqDev

ID: 38187

d、保存退出

e、成功提交

====================================== 19、push问题 ! [remote rejected] HEAD -> refs/for/develop-m (change 提交地址 closed) error: failed to push some refs to '项目地址'

a、git commit --amend 删掉change_id就可以了,保存退出后会自动生成一个新的change_id,再次执行push就可以推到库了。

====================================== 20、push指定人
git push dev_17475:refs/for/develop-m/%***

====================================== 21、合并代码 1、切换本地master分支,pull最新的代码 2、切换开发分支,合并master分支代码,解决冲突 3、git commit --amend 4、提交代码

====================================== 22、git cherry-pick 的使用 之前和同事在不同的分支开发一个功能的不同模块,在自己分支有用到同事分支的一些实现,git cherry-pick来搞定:

git cherry-pick 能够把另一个分支的一个或多个提交复制到当前分支,具体使用如下:

首先git checkout 到另一个分支,然后使用git log找到想要复制的commit 的id,记录下来

切换到自己分支,使用git cherry-pick [上面记录的commit id] 回车即可!

如果想要复制多个, 使用git cherry-pick (commitid1..commitid100],commitid1为想复制的最老提交(不包括),commitid100为想复制的最新提交(包括)

如果想要包括commitid1,那么在commitid1后加^即可,即 git cherry-pick [commitid1^..commitid100]!

git cherry-pick 005a1a422ecd5268542e7c709b4f548ce093f7bd

======================================= 23、合并多次的提交 git rebase -i change_id
git rebase -i HEAD^2

在rebase的过程中,也许会出现冲突(conflict)。在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用”git add“命令去更新这些内容的索引(index), 然后,你无需执行 git commit,只要执行: $ git rebase --continue

在任何时候,可以用--abort参数来终止rebase的操作,并且”mywork“ 分支会回到rebase开始前的状态。 $ git rebase --abort

24、18741 提前提交代码

25、释放无权限提交 git push origin test_1:refs/for/test_2 --no-thin

======================================= 26、当前的修改还未完成,不想 commit ,想切换到别的分支 --> stash git stash 代码暂存
git stash pop 暂存代码取出 git stash list 暂存的列表 git stash clear :删除所有缓存的stash git stash show :显示做了哪些改动